#ifndef __BoardData_H
#define __BoardData_H

#ifdef APM32E10X_HD
	#include "apm32e10x_misc.h"
#elif defined AT32F403AVGT7
	#include "at32f403a_407_misc.h"
#else
	#include "apm32f10x_misc.h"
#endif

#include "SQDriConfig.h"
#include "TEMP_Detect.h"

#if meter485_ON > 0
	#include "meter485.h"
#endif

//////////////////////////////////////////// MCU 相关 ////////////////////////////////////////////////////
// MCU_ID 3个32位; 12个8位。
#define  MCU_ID_1          *(volatile uint32_t *)0x1ffff7e8 // 0x1ffff7e8 0x1ffff7ec 0x1ffff7f0 + 0xE0042000
#define  MCU_ID_2          *(volatile uint32_t *)0x1ffff7ec // 0x1ffff7e8 0x1ffff7ec 0x1ffff7f0 + 0xE0042000
#define  MCU_ID_3          *(volatile uint32_t *)0x1ffff7f0 // 0x1ffff7e8 0x1ffff7ec 0x1ffff7f0 + 0xE0042000

//////////////////////////////////////////// relay 继电器相关 ////////////////////////////////////////////
#define  relay_stable_time                2000   //继电器稳定时间，此时间内继电器不会跳变。


//////////////////////////////////////////// 常量定义 ////////////////////////////////////////////////////
// CP获取方式：
#define   CP_Mode_sta            1                      // 统计平均法;   
#define   CP_Mode_tick           2                      // 触发获取CP值;  
#define   CP_Mode                CP_Mode_tick  

// ADC采样顺序：
enum ADC_Indx{
	  #if UI_Meter_Method == Meter_SelfADC
	  ADC_ChgU,
	  #if ADC_num == 1
	  ADC_ChgI,
	  #endif
	  #endif	  
	  ADC_CP,
	  #if ADC_num == 1
	    ADC_TEMPR_BoardIn,
	    #ifdef TEMP2_ADC_Chn
	    ADC_TEMPR_External, 
	    #endif
	    #ifdef TEMP3_ADC_Chn
	    ADC_TEMPR_ChgGun, 
	    #endif	
      #if PE_method == PE_method_ADC
		  ADC_PE,
		  #endif  
    #elif ADC_num == 2
      #ifdef  TEMP2_ADC_Chn
				ADC_TEMPR_External,
	    #else
				#ifdef  TEMP3_ADC_Chn
				ADC_TEMPR_ChgGun,
				#endif
      #endif
	  #endif		
	  ADC_Total,
};
#if ADC_num > 1
enum ADC2_Indx{
	  #if UI_Meter_Method == Meter_SelfADC
	  ADC_ChgI,
	  #endif
	  ADC_TEMPR_BoardIn,
		#if ADC_num == 2
	    #ifdef  TEMP2_ADC_Chn
				#ifdef  TEMP3_ADC_Chn
				ADC_TEMPR_ChgGun,
	      #else
	      ADC_TEMPR_MCU,
				#endif
	    #else
				#ifdef  TEMP3_ADC_Chn				
	      ADC_TEMPR_MCU,
				#endif
      #endif
	  #endif
	  ADC2_Total,
};
#endif
#if ADC_num > 2 && (defined TEMP2_ADC_Chn || defined TEMP3_ADC_Chn)
enum ADC3_Indx{
	  #ifdef  TEMP2_ADC_Chn
		ADC_TEMPR_External,
		#endif 	
	  #ifdef  TEMP3_ADC_Chn
		ADC_TEMPR_ChgGun,
    #endif	
	  ADC3_Total,
};
#endif

// ADC数据DMA保存：
typedef union{	  
	  #if ADC_num == 1
	  __IO uint16_t  ADC_Value[ADC_Total];
	  __IO struct{			  
			  // ADC2和ADC1的数据
			  #if UI_Meter_Method == Meter_SelfADC
	      uint16_t ADCValue_ChgU;
				uint16_t ADCValue_ChgI;			  
				#endif
	      uint16_t ADCValue_CP;
			  uint16_t ADCValue_TEMPR_BoardIn;
			  #ifdef TEMP2_ADC_Chn
				uint16_t  ADCValue_TEMPR_External; 
				#endif
				#ifdef TEMP3_ADC_Chn
				uint16_t  ADCValue_TEMPR_ChgGun; 
				#endif
			  #if PE_method == PE_method_ADC
		    uint16_t  ADCValue_PE;
		    #endif 
			  
    }ADC_Item;	
	
	  #elif ADC_num == 2
	  __IO uint32_t  ADC_Value[ADC_Total];
	  __IO struct{			  
			  // ADC2和ADC1的数据
			  #if UI_Meter_Method == Meter_SelfADC
				uint16_t ADCValue_ChgI;
			  uint16_t ADCValue_ChgU;
				#endif
			  uint16_t ADCValue_TEMPR_BoardIn;
        uint16_t ADCValue_CP; 			
	      // 温度2和3
	      #ifdef  TEMP2_ADC_Chn
					#ifdef  TEMP3_ADC_Chn
					uint16_t  ADCValue_TEMPR_ChgGun;
	        uint16_t  ADCValue_TEMPR_External;
					#else
					uint16_t  ADCValue_TEMPR_MCU;
					uint16_t  ADCValue_TEMPR_External;
					#endif
				#else
					#ifdef  TEMP3_ADC_Chn				
					uint16_t  ADCValue_TEMPR_MCU;
					uint16_t  ADCValue_TEMPR_ChgGun;
					#endif
				#endif 	      
    }ADC_Item;
		
	  #elif ADC_num ==3 && (defined TEMP2_ADC_Chn || defined TEMP3_ADC_Chn)
	  struct{
			  __IO uint16_t  ADC3_Value[ADC3_Total];
				__IO uint32_t  ADC_Value[ADC_Total];	      
    }ADC_Array;
    __IO struct{
			  // ADC3的数据
			  #ifdef  TEMP2_ADC_Chn
				uint16_t  ADCValue_TEMPR_External;
				#endif 	
				#ifdef  TEMP3_ADC_Chn
				uint16_t  ADCValue_TEMPR_ChgGun;
				#endif	
			  // ADC2和ADC1的数据
			  #if UI_Meter_Method == Meter_SelfADC
				uint16_t ADCValue_ChgI;
			  uint16_t ADCValue_ChgU;
				#endif
			  uint16_t ADCValue_TEMPR_BoardIn;
			  uint16_t ADCValue_CP;
    }ADC_Item;		  
	  #endif      
} ADC_BUF;
// ADC_BUF结构体大小；单位=字节。
#if ADC_num == 1
#define  ADC_BUF_SIZE                      ADC_Total*2
#elif ADC_num == 2
#define  ADC_BUF_SIZE                      ADC_Total*4
#elif ADC_num ==3 && (defined TEMP2_ADC_Chn || defined TEMP3_ADC_Chn)
#define  ADC_BUF_SIZE                      ADC_Total*4+ADC3_Total
#endif      


// ADC CP 常量；CP读取时钟0.01ms；
#define    ADC_sampl_time             0.1              // ADC采样时间间隔；0.1ms = 20ms / UI_Datas_Len = 20ms / 200 = 0.1ms
#define    CP_ID_Len                  10              // CP电压采样数；获取采样中的最大值；数值越大越容易采样到PWM波峰
#define    CP_Datas_Peak_Len          10              // CP PWM 峰值采样数，求平均数用；10个波形,做一次平均 = 10 * 1 = 10ms。
#define    UI_Datas_Len               200              // UI数据长度：200*0.1ms=20ms = 50HZ;
#define    CP_Datas_Len               200              // 和UI_Datas_Len一样的采样率; 
#define    adc_ticks                  2                // 20 / 0.05 / UI_Datas_Len = 400 / UI_Datas_Len = 2 

#define    CP_state_ticks             5              // 读取状态时间间隔；5*10ms = 50ms读取一次；
#define    TMP_Read_ticks             50              // 读取其他数据的时间间隔；500次ADC时钟，读取一次；
#define    UI_Read_ticks              100              // ticks = 100; 一个UI数据读取时间 = 1ms；UI_Datas_Len = 20个数据时间 = 20 * 1 = 20ms；交流电周期 = 20ms；
#define    Vref_Read_ticks            500              //参考电压读取频率
#define    check_ticks                1000            // 检测数据时间：1000个时钟 = 1000 * 0.1ms = 100ms
#define    Leak_Read_ticks            1                //漏电状态读取频率：50000个时钟 = 5 * 10 = 50ms
#define    PE_Read_ticks              50               // 接地读取频率：50个时钟 = 50 * 10 = 500ms
#define    self_check_ticks           30               // 自检频率：30个时钟 = 30 * 10 = 300ms

#if Using_UART_LCD == LCD_0P42_IIC
#define    oled042_reset_ticks        400             // OLED屏重新初始化时间：60000 = 10分钟。
#define    oled042_reset_timeSeg      97              // 重新初始化时间片
#endif

#if CC_Detect_type > 0
#define    CC_Dectect_ticks           100              // CC检测频率：100 * 10 = 1000ms = 1s
#endif

#if RlyAdh_Detect_type > 0
#define    RlyAdh_Dectect_ticks       100              // 继电器粘连检测频率：100 * 10 = 1000ms = 1s
#define    RlyAdh_Status_ticks        500              // 继电器粘连检测频率：100 * 10 = 1000ms = 1s
#endif

#define    check_state_ticks          10               // 检测状态数据时间：10个时钟 = 10 * 10ms = 100ms
#define    get_tmprValue_ticks        100              // 检测状态数据时间：100个时钟 = 100 * 10ms = 1000ms

#if CURVE_ON  > 0
#define    save_curve_ticks           60000              // 保存曲线数据的时间间隔; 60000 * 10ms = 600秒 = 10分钟
#endif

#if meter485_ON > 0
#define    mt485OffLineTime           10000              // 485智能电表掉线时间：超过则掉线。
#endif

#if BleWifi_type == BleWifi_Ai_WB2
#define    bleWifi_Reset_ticks        100                // 1秒
#define    bleWifi_ticks              500                // 5秒检查下状态
#endif

// CP 电路放大系数：
#define    CP_Amplifier               4                // CP信号，分压：100/(100+300)

#define    refreshUpBoardFreq         15      

//////////////////////////////////////// 充电流程控制参数 //////////////////////////////////////////////////
enum CHG_DTAGE_ID{
	  CHG_IDLE = 1,        //充电空闲 1
	  CHG_PLUG_IN,         //插枪 2
	  CHG_StartUP,         //启动充电 3
	  CHG_CHARGING,        //正在充电 4
	  CHG_ERROR,           //充电错误，并停充 5
	  CHG_FULL,            //充满 6
    CHG_STOP,            //停止充电 7
	  CHG_PLUG_OUT,        //拔枪  8
	  CHG_STATE_NUMS       //状态总数 - 1
};

// 外部控制充电;
// 1 = 自锁按钮启动; 2 = 非自锁按键启动； 3 = 刷卡充电；4 = APP 通过蓝牙指令充电; 5 = 指纹充电;  6 = 刷脸充电;
typedef union{	  
	  __IO uint8_t  chargeControl;
	  __IO struct{
			  __IO uint8_t reason_btn           : 1;   // 按钮
			  __IO uint8_t reason_resv          : 1;   // 预约启动充电
        __IO uint8_t reason_card          : 1;   // 刷卡启动
        __IO uint8_t reason_finger        : 1;   // 指纹启动
        __IO uint8_t reason_face          : 1;   // 刷脸启动
        __IO uint8_t reason_app           : 1;   // App指令启动			  
			  __IO uint8_t reason_recover       : 1;   // 恢复充电
			  __IO uint8_t reason_other         : 1;
    }chargeControl_bit;	
} Chg_External_Reason;
#define  externalIntv_default             500          // 默认外部触发充电的时间间隔=500*10ms=5秒。

//////////////////////////////////////// 温度控制相关 //////////////////////////////////////////////////
// 温度控制参数
struct Tmpr_Ctrl{
	  uint8_t   tmrp_using_id;   //温度计检测控制的id
		uint8_t   tmpr_state;      //温度状态
		uint8_t   tmpr_state_pre;
		uint64_t  tmpr_change_tm;  //温度改变；
};

// 板内温度状态
enum tmprState_BoardIn{
	  tmprState_BoardIn_stop = 1, 
	  tmprState_BoardIn_adjust,
	  tmprState_BoardIn_warn,
	  tmprState_BoardIn_normal,
	  tmprState_BoardIn_err,	  
};

// 默认温度计使用
enum tmrp_type{
	  tmrp_using_boardIn = 1, 
	  tmrp_using_Ext1, 
	  tmrp_using_Ext2, 
	  tmrp_using_IC, 
};

// 温度分压电阻
#define    Rptl_TMP_BoardIn       10000            // 分压电阻
#define    Rptl_TMP_Ext1          10000            // PA2
#define    Rptl_TMP_Ext2          2400
 
// IC内部温度参数
#define    Avg_Slope_TMP_IC       4.3    
#define    V25_TMP_IC             1.43   

// 温度计算参数：
// NTC参数
#define    B_ntc                  3950
#define    Kd_0                   273.15
#define    T0_ntc                 (Kd_0 + 25)
#define    R0_ntc                 10000

// 温度正常范围:[误差R=2.45欧姆];
// 温度值对照：65 = 2056; 85=1052.0;  90=899.0;  95 = 772; 100 = 666.0;  105 = 575.0;  125 = 329.0   
// 对应的ADC值：85对应的1052欧，所对应的ADC值=390；其余类推。分压电阻 = 10K。
// ADC = 4095 / (10000+Rntc) * Rntc; Rntc = 某温度对应的电阻的测电压ADC值
#define    tmpr_limit_low_R              4020       //534215.0f     //-50
#define    tmpr_normal_R                 390        //1052.0f       //85
#define    tmpr_adjust_R                 293        //772.0f        //95  
#define    tmpr_stop_R                   256        //666.0f        //100  
#define    tmpr_limit_high_R             20         //50.0f         //125;超过量程的一部分，按照过温处理。
// 板外温度
#define    tmprExt_limit_low_R           4020       //534215.0f     //-50
#define    tmprExt_normal_R              698        //2056.0f       //65
#define    tmprExt_adjust_R              520        //1456.0f       //75  
#define    tmprExt_stop_R                450        //1235.0f       //80  
#define    tmprExt_limit_high_R          20         //50.0f         //125;超过量程的一部分，按照过温处理。

// 根据不同频率设置不同的时钟预分频参数
#ifdef APM32F10X_HD
#define timerDiv     95
#elif defined APM32E10X_HD
#define timerDiv     119
#elif defined AT32F403AVGT7
#define timerDiv     239
#else
#define timerDiv     95
#endif
//////////////////////////////////////////////////////// 定时器 ///////////////////////////////////////////////////////
// 定时器的Arr值：溢出值
#define  TmrPeriod_PWM                        999
#define  TmrPeriod_Task                       9999
#define  PWMPeriod_Relay                      49         //20KHz
#define  TmrPeriod_CLOCK                      999
#ifdef SQDri_EVSEB_7KW
	#define  TmrPeriod_ADCDelay                 89
  #define  TmrPeriod_CarD1Delay               89	
#elif defined SQDri_EVSEB_11KW	
  #define  TmrPeriod_ADCDelay                 89 
  #define  TmrPeriod_CarD1Delay               89	
#else
  #define  TmrPeriod_ADCDelay                 89        //89us
	#define  TmrPeriod_CarD1Delay               89
#endif
#define  TmrPeriod_ADC                        99
#define  PWM_Pulse                            1000
#define  Relay_DutyPulse_init                 0 

// relay继电器占空比常量
#define  Relay_On_Duty                        1000
#define  Relay_Off_Duty                       0
#define  Relay_persist_Duty                   500


//////////////////////////////////////////////////////// 电压参数 ///////////////////////////////////////////////////////
// 电压计量ADC相关参数
#define    Rspl_U                    100          //  采样电阻
#define    Rlimit_U                  200000       // 20+6*30=200K；限流电阻
#define    Uamp_Coil                 1
#define    Uamp_Amplifier            14.6364      // K = 1 + Rrf / Rgnd = 1 + 300 / 22 = 14.6364
#define    K_U                       136.64596    // Ureal / Utest = (Rlimit_U * Uamp_Coil) / (Rspl_U * Uamp_Amplifier)  K = 真实值 / 测量值

// 电流参数
#define    Rspl_I                      20           //  采样电阻
#define    Iamp_Coil                   2000
#define    Iamp_Amplifier              5            // K = 1 + Rrf / Rgnd = 1 + 300 / 75 = 5  放大电路的放大系数
#define    K_I                         20           // K = Iamp_Coil / (Iamp_Amplifier * Rspl_I) = 20    K = 真实值 / 测量值

// 电压电流计算
#define    K_stat                    0.653134
#define    U_param                   0.220235247    // = 3.3f / 4095 * K_U * 2  
#define    I_param                   0.032234432    // = 3.3f / 4095 * K_I * 2
#define    ampUFactor                0.512283728
#define    ampIFactor  	             0.511423683
#define    U_param_adj               0.112822933    // = U_param * ampUFactor  
#define    I_param_adj               0.016485452    // = I_param * ampIFactor

//#define    U_param                 0.15535057824    // = 3.3f / 4095 * K_U * 2 * K_stat
//#define    I_param                 0.02273767632    // = 3.3f / 4095 * K_I * 2 * K_stat
#define    U_param_ext               0.077864918   // = U_param / 2 / 1.414213562373 = 0.220235247 / 2 / 1.414213562373
#define    I_param_ext               0.011396593   // = I_param / 2 / 1.414213562373 = 0.032234432 / 2 / 1.414213562373

//电压控制变量
struct U_Ctrl{
    uint8_t   U_state;                //电压状态
		uint8_t   U_state_pre;
		uint64_t  Ustt_change_tm;		      //电压状态改变计时；
	  uint64_t  POWER_ON_Tm;            //上电开始时间
    uint64_t  Ustt_change_stabi_tm;   //电压状态稳定后，计时！ 
};

// 电压状态
enum U_States{
	  U_State_normal = 1,
	  U_State_ovrvolt,
	  U_State_udrvolt,
	  U_State_err,            
	  U_State_0V,
};

// 电压参数表：不同算法原始值不同
#if (UI_Meter_Method == Meter_SelfADC)
	#if (GET_UI_METHOD_ID == UI_METHOD_MAX)
		// 算法：U或I值 / U_param_ext; 0.077864918
		#define    U_900V_SelfMax              11558           //900.0f 
		#define    U_263V_SelfMax              3378            //263.0f
		#define    U_250V_SelfMax              3211            //250.0f
		#define    U_186V_SelfMax              2389            //186.0f 
		#define    U_160V_SelfMax              2055            //160.0f
		#define    U_10V_SelfMax               128             //10.0f
		#define    U_F05V_SelfMax              -6              //-0.5f 
	#elif (GET_UI_METHOD_ID == UI_METHOD_RMS)
    // 算法：(U / U_param)^2 * (UI_Datas_Len / 2) = (U / 0.112822933)^2 * 100
		#define    U_900V_SelfRMS              4200000000ul     //900.0f 
		#define    U_263V_SelfRMS              543396361        //263.0f  
		#define    U_250V_SelfRMS              491004244        //250.0f  
		#define    U_186V_SelfRMS              271788525        //186.0f  
		#define    U_160V_SelfRMS              201115338        //160.0f  
		#define    U_10V_SelfRMS               785607            //10.0f
		#define    U_F05V_SelfRMS              1964             //-0.5f    
	#endif
#elif (UI_Meter_Method == Meter_GuageIC_RN8209)
	// 算法：U / K_URMS = U / 0.00011403330634622
	#define     U_900V_RN8209               7892431          //900.0f 
	#define     U_263V_RN8209               2306344          //263.0f 
	#define     U_250V_RN8209               2192342          //250.0f 
	#define     U_186V_RN8209               1631102          //186.0f 
	#define     U_160V_RN8209               1403099          //160.0f 
	#define     U_10V_RN8209                87694            //10.0f
	#define     U_F05V_RN8209               0                //-0.5f 
#elif (UI_Meter_Method == Meter_GuageIC_RN8302B)
	// 算法：U / K_URMS = U / 0.00000858572827358274 
	#define     U_900V_RN8302B               104825120        //900.0f 
	#define     U_263V_RN8302B               30632230         //263.0f 
	#define     U_250V_RN8302B               29118089         //250.0f 
	#define     U_186V_RN8302B               21663858         //186.0f 
	#define     U_160V_RN8302B               18635577         //160.0f 
	#define     U_10V_RN8302B                1164724          //10.0f
	#define     U_F05V_RN8302B               0                //-0.5f
#endif
#if meter485_ON > 0
  #define     U_900V_Mt485               9000               //900.0f 
	#define     U_263V_Mt485               2630               //263.0f 
	#define     U_250V_Mt485               2500               //250.0f 
	#define     U_186V_Mt485               1860               //186.0f 
	#define     U_160V_Mt485               1600               //160.0f 
	#define     U_10V_Mt485                100                //10.0f
	#define     U_F05V_Mt485               0                  //-0.5f
#endif

// 电压状态阈值：不同算法对应的阈值不一样
#if (UI_Meter_Method == Meter_SelfADC)
	#if (GET_UI_METHOD_ID == UI_METHOD_MAX)
		// 算法：U或I值 / U_param_ext; 0.077864918
		#define    U_limit_high                U_900V_SelfMax            //900.0f 
		#define    U_ovrvolt_low               U_263V_SelfMax            //263.0f
		#define    U_normal_high               U_250V_SelfMax            //250.0f
		#define    U_normal_low                U_186V_SelfMax            //186.0f 
		#define    U_udrvolt_high              U_160V_SelfMax            //160.0f
		#define    U_udrvolt_low               U_10V_SelfMax             //10.0f
		#define    U_limit_low                 U_F05V_SelfMax            //-0.5f 
		
	#elif (GET_UI_METHOD_ID == UI_METHOD_RMS)		
		#define    U_limit_high                U_900V_SelfRMS           //900.0f 
		#define    U_ovrvolt_low               U_263V_SelfRMS           //263.0f  
		#define    U_normal_high               U_250V_SelfRMS           //250.0f  
		#define    U_normal_low                U_186V_SelfRMS           //186.0f  
		#define    U_udrvolt_high              U_160V_SelfRMS           //160.0f  
		#define    U_udrvolt_low               U_10V_SelfRMS            //10.0f
		#define    U_limit_low                 U_F05V_SelfRMS           //-0.5f   

	#endif
#elif (UI_Meter_Method == Meter_GuageIC_RN8209)
	// 算法：U / K_URMS = U / 0.00011403330634622
	#define     U_limit_high                 U_900V_RN8209                //900.0f 
	#define     U_ovrvolt_low                U_263V_RN8209                //263.0f 
	#define     U_normal_high                U_250V_RN8209                //250.0f 
	#define     U_normal_low                 U_186V_RN8209                //186.0f 
	#define     U_udrvolt_high               U_160V_RN8209                //160.0f 
	#define     U_udrvolt_low                U_10V_RN8209                 //10.0f
	#define     U_limit_low                  U_F05V_RN8209                //-0.5f 
	
#elif (UI_Meter_Method == Meter_GuageIC_RN8302B)
	#define    U_limit_high                U_900V_RN8302B               //900.0f
	#define    U_ovrvolt_low               U_263V_RN8302B               //263.0f 
	#define    U_normal_high               U_250V_RN8302B               //250.0f 
	#define    U_normal_low                U_186V_RN8302B               //186.0f 
	#define    U_udrvolt_high              U_160V_RN8302B               //160.0f 
	#define    U_udrvolt_low               U_10V_RN8302B                //10.0f
	#define    U_limit_low                 U_F05V_RN8302B               //-0.5f
	
#endif

// 实数参数：电压：0.1V；电流：0.01A
#if meter485_ON > 0
  #define    U_limit_high2                U_900V_Mt485                        //900.0f
	#define    U_ovrvolt_low2               U_263V_Mt485                        //263.0f 
	#define    U_normal_high2               U_250V_Mt485                        //250.0f 
	#define    U_normal_low2                U_186V_Mt485                        //186.0f 
	#define    U_udrvolt_high2              U_160V_Mt485                        //160.0f 
	#define    U_udrvolt_low2               U_10V_Mt485                         //10.0f
	#define    U_limit_low2                 U_F05V_Mt485                        //-0.5f  
	
#endif

// 电压状态判断
#if PowerSupplyPhase == 3  //3相
	#define IS_U_State_ovrvolt()      (uiValues.U_value >= U_ovrvolt_low && uiValues.U_value < U_limit_high) || \
                                    (uiValues.UB_value >= U_ovrvolt_low && uiValues.UB_value < U_limit_high) || \
                                    (uiValues.UC_value >= U_ovrvolt_low && uiValues.UC_value < U_limit_high)
  #define IS_U_State_normal()       (uiValues.U_value > U_udrvolt_high && uiValues.U_value < U_ovrvolt_low) || \
                                    (uiValues.UB_value > U_udrvolt_high && uiValues.UB_value < U_ovrvolt_low) || \
                                    (uiValues.UC_value > U_udrvolt_high && uiValues.UC_value < U_ovrvolt_low)
  #define IS_U_State_udrvolt()      (uiValues.U_value <= U_udrvolt_high && uiValues.U_value > U_udrvolt_low) || \
                                    (uiValues.UB_value <= U_udrvolt_high && uiValues.UB_value > U_udrvolt_low) || \
                                    (uiValues.UC_value <= U_udrvolt_high && uiValues.UC_value > U_udrvolt_low) 
  #define IS_U_State_0V()            uiValues.U_value <= U_udrvolt_low || uiValues.UB_value <= U_udrvolt_low || uiValues.UC_value <= U_udrvolt_low 
#else
  #define IS_U_State_ovrvolt()      uiValues.U_value >= U_ovrvolt_low && uiValues.U_value < U_limit_high
  #define IS_U_State_normal()       uiValues.U_value > U_udrvolt_high && uiValues.U_value < U_ovrvolt_low
  #define IS_U_State_udrvolt()      uiValues.U_value <= U_udrvolt_high && uiValues.U_value > U_udrvolt_low
  #define IS_U_State_0V()           uiValues.U_value <= U_udrvolt_low
#endif

// 智能电表的电压判断
#if meter485_ON  > 0
	#if PowerSupplyPhase == 3  //3相
		#define IS_U_State_ovrvolt2()      (uiValues2.U_value >= U_ovrvolt_low2 && uiValues2.U_value < U_limit_high2) || \
																			 (uiValues2.UB_value >= U_ovrvolt_low2 && uiValues2.UB_value < U_limit_high2) || \
																			 (uiValues2.UC_value >= U_ovrvolt_low2 && uiValues2.UC_value < U_limit_high2)
		#define IS_U_State_normal2()       (uiValues2.U_value > U_udrvolt_high2 && uiValues2.U_value < U_ovrvolt_low2) || \
																			 (uiValues2.UB_value > U_udrvolt_high2 && uiValues2.UB_value < U_ovrvolt_low2) || \
																			 (uiValues2.UC_value > U_udrvolt_high2 && uiValues2.UC_value < U_ovrvolt_low2)
		#define IS_U_State_udrvolt2()      (uiValues2.U_value <= U_udrvolt_high2 && uiValues2.U_value > U_udrvolt_low2) || \
																			 (uiValues2.UB_value <= U_udrvolt_high2 && uiValues2.UB_value > U_udrvolt_low2) || \
																			 (uiValues2.UC_value <= U_udrvolt_high2 && uiValues2.UC_value > U_udrvolt_low2) 
		#define IS_U_State_0V2()            uiValues2.U_value <= U_udrvolt_low2 || uiValues2.UB_value <= U_udrvolt_low2 || uiValues2.UC_value <= U_udrvolt_low2 
	#else
		#define IS_U_State_ovrvolt2()      uiValues2.U_value >= U_ovrvolt_low2 && uiValues2.U_value < U_limit_high2
		#define IS_U_State_normal2()       uiValues2.U_value > U_udrvolt_high2 && uiValues2.U_value < U_ovrvolt_low2
		#define IS_U_State_udrvolt2()      uiValues2.U_value <= U_udrvolt_high2 && uiValues2.U_value > U_udrvolt_low2
		#define IS_U_State_0V2()           uiValues2.U_value <= U_udrvolt_low2
	#endif
#endif


// 电流状态参数：
enum I_States{
	  I_state_normal = 0,         
	  I_state_adjust,                 //  1         //微调
	  I_state_over_current,           //  2         //过流
	  I_state_over_recv,              //  3         //过流
	  I_state_short_circuit,          //  4         //短路
	  I_state_float_chg,              //  5         //浮充
	  I_state_stop_chg,               //  6         //停充
	  I_state_err,	                  //  7         //电流计量坏了
};

// 电流数据表：不同电流对应的原始数据
#if (UI_Meter_Method == Meter_SelfADC)
	#if (GET_UI_METHOD_ID == UI_METHOD_MAX)
    #if flexible_rated_value == 0
			// 算法：I值 / I_param_ext = 0.011396593
			#define    I_F05A_SelfMax               -44                  //-0.5f     
			#define    I_02A_SelfMax                18                   //0.2f      //浮充
			#define    I_03A_SelfMax                26                   //0.3f
			#define    I_05A_SelfMax                44                   //0.5f 
			#define    I_2A_SelfMax                 175                  //2.0f   
			#define    I_3A_SelfMax                 263                  //3.0f      //过流
			#define    I_5A_SelfMax                 439                  //5.0f      //短路
			#define    I_6A_SelfMax                 526                  //6.0f
			#define    I_8A_SelfMax                 702                  //8.0f
			#define    I_10A_SelfMax                877                  //10.0f 
			#define    I_13A_SelfMax                1141                 //13.0f
			#define    I_16A_SelfMax                1404                 //16.0f 
			#define    I_32A_SelfMax                2808                 //32.0f
			#define    I_50A_SelfMax                4387                 //50.0f     //最大过流值=40 * 1.25			
			#define    I_54A_SelfMax                4738                 //54.0f     //最大短路值=40 * 1.35			
			#define    I_100A_SelfMax               8775                 //100.0f  
		#else
		  #define    get_rated_value()            I_State_Flag.I_rated_valuef / I_param_ext  
		#endif
    // 电流系数：
    #define    IRatio_025_SelfMax           0.25f
    #define    IRatio_035_SelfMax           0.35f   
    
	#elif (GET_UI_METHOD_ID == UI_METHOD_RMS)
	  #if flexible_rated_value == 0
			// 算法：(I / I_param)^2 * (UI_Datas_Len / 2) = (I / 0.016485452)^2 * 100		
			#define    I_F05A_SelfRMS                  0              //-0.5f  
			#define    I_02A_SelfRMS                   14718           //0.2f      //浮充  
			#define    I_2A_SelfRMS                    1471832         //2.0f   
			#define    I_3A_SelfRMS                    3311622        //3.0f      //过流
			#define    I_5A_SelfRMS                    9198951        //5.0f      //短路		
			#define    I_6A_SelfRMS                    13246489        //6.0f		
			#define    I_8A_SelfRMS                    23549314       //8.0f 
			#define    I_10A_SelfRMS                   36795803       //10.0f		
			#define    I_13A_SelfRMS                   62184907       //13.0f		
			#define    I_16A_SelfRMS                   94197255       //16.0f
			#define    I_32A_SelfRMS                   376789020      //32.0f
			#define    I_50A_SelfRMS                   919895068      //50.0f     //最大过流值=40 * 1.25			
			#define    I_54A_SelfRMS                   1072965607ul   //54.0f     //最大短路值=40 * 1.35
			#define    I_100A_SelfRMS                  3679580271ul   //100.0f
    #else
		  #define    get_rated_value()              (I_State_Flag.I_rated_valuef / I_param_adj)*(I_State_Flag.I_rated_valuef / I_param_adj) * (UI_Datas_Len / 2)  
		#endif		
		// 电流系数：K^2
    #define    IRatio_025_SelfRMS              0.0625f    
    #define    IRatio_035_SelfRMS              0.1225f     
		
	#endif
#elif (UI_Meter_Method == Meter_GuageIC_RN8209)
  #if flexible_rated_value == 0
		// 算法：I / K_IRMS = I / 0.00000607315806369236
		#define    I_F05A_RN8209                  -82329          //-0.5f  
		#define    I_02A_RN8209                   32932           //0.2f      //接近0V阈值
		#define    I_2A_RN8209                    329318          // 2.0f   
		#define    I_3A_RN8209                    493977          //3.0f //过流
		#define    I_5A_RN8209                    823295          //5.0f      //短路
		#define    I_6A_RN8209                    987954          //6.0f 
		#define    I_8A_RN8209                    1317272         //8.0f
		#define    I_10A_RN8209                   1646590         //10.0f	
		#define    I_13A_RN8209                   2140567         //13.0f	
		#define    I_16A_RN8209                   2634544         //16.0f  
		#define    I_32A_RN8209                   5269087         //32.0f
		#define    I_50A_RN8209                   8232949         //50.0f     //最大过流值 = 40 * 1.25
		#define    I_54A_RN8209                   8891585         //54.0f     //最大短路值 = 40 * 1.35
		#define    I_100A_RN8209                  16465898        //100.0f  
	#else
	  #define    get_rated_value()              I_State_Flag.I_rated_valuef / K_IRMS  
	#endif
	// 电流系数：
  #define    IRatio_025_RN8209              0.25f     
  #define    IRatio_035_RN8209              0.35f  
	
#elif (UI_Meter_Method == Meter_GuageIC_RN8302B)
  #if flexible_rated_value == 0
		// 算法：I / K_IRMS = I / 0.00000121407610151746 
		#define    I_F05A_RN8302B                  -411836         //-0.5f 
		#define    I_02A_RN8302B                   164734          //0.2f      //接近0V阈值 		
		#define    I_2A_RN8302B                    1647343         //2.0f     //浮充
		#define    I_3A_RN8302B                    2471015         //3.0f //过流
		#define    I_5A_RN8302B                    4118358         //5.0f      //短路
		#define    I_6A_RN8302B                    4942030         //6.0f
		#define    I_8A_RN8302B                    6589373         //8.0f	
		#define    I_10A_RN8302B                   8236716         //10.0f 
		#define    I_13A_RN8302B                   10707730        //13.0f
		#define    I_16A_RN8302B                   13178746        //16.0f   
		#define    I_32A_RN8302B                   26357491        //32.0f 
		#define    I_50A_RN8302B                   41183580        //50.0f     //最大过流值 = 40 * 1.25
		#define    I_54A_RN8302B                   44478266        //54.0f     //最大短路值 = 40 * 1.35
		#define    I_100A_RN8302B                  82367160        //100.0f   
	#else
	  #define    get_rated_value()              I_State_Flag.I_rated_valuef / K_IRMS
	#endif
  // 电流系数：
  #define    IRatio_025_RN8302B              0.25f     
  #define    IRatio_035_RN8302B              0.35f 
#endif
#if meter485_ON > 0 
  #define    I_F05A_Mt485                   -50               //-0.5f 
	#define    I_02A_Mt485                    20                //0.2f      //接近0V阈值 		
	#define    I_2A_Mt485                     200               //2.0f     //浮充
	#define    I_3A_Mt485                     300               //3.0f //过流
	#define    I_5A_Mt485                     500               //5.0f      //短路
	#define    I_6A_Mt485                     600               //8.0f
	#define    I_8A_Mt485                     800               //8.0f
	#define    I_10A_Mt485                    1000              //10.0f 
  #define    I_13A_Mt485                    1300              //13.0f  
	#define    I_16A_Mt485                    1600              //16.0f   
	#define    I_32A_Mt485                    3200              //32.0f 
	#define    I_50A_Mt485                    5000              //50.0f     //最大过流值 = 40 * 1.25
	#define    I_54A_Mt485                    5400              //54.0f     //最大短路值 = 40 * 1.35
	#define    I_100A_Mt485                   10000             //100.0f   
  // 电流系数：
  #define    IRatio_025_Mt485                0.25f     
  #define    IRatio_035_Mt485                0.35f 
#endif

#define        thrhld_fltChg_tm              300000          //浮充充电的有效时间，5分钟都是浮充阶段，即确认浮充。5*60*1000
#define        Chging_Avail_tm               15000           //开始成电后,电流正常状态，并持续一段时间，算开启充电中。

// 电流状态阀值：
#if (UI_Meter_Method == Meter_SelfADC)
	#if (GET_UI_METHOD_ID == UI_METHOD_MAX)
		#if STD_USING == STD_EUR  
				#define    I_thrhld_Adj                 I_2A_SelfMax                 //2.0f   
				#define    I_thrhld_over                I_3A_SelfMax                 //3.0f      //过流				    
				#define    I_thrhld_over_max            I_50A_SelfMax                //50.0f     //最大过流值=40 * 1.25				
				#define    I_thrhld_short               I_5A_SelfMax                 //5.0f      //短路				     
				#define    I_thrhld_short_max           I_54A_SelfMax                //54.0f     //最大短路值=40 * 1.35				
				#define    I_thrhld_fltChg              I_5A_SelfMax                 //2.0f      //浮充
				#define    I_thrhld_0                   I_02A_SelfMax                //0.2f      //电    
				#define    I_tldRatio_over              IRatio_025_SelfMax 
				#define    I_tldRatio_short             IRatio_035_SelfMax 
		#endif
		#define        I_limit_low                  I_F05A_SelfMax                 //-0.5f     
		#define        I_limit_high                 I_100A_SelfMax                //100.0f

	#elif (GET_UI_METHOD_ID == UI_METHOD_RMS)
		// 算法：(I / I_param) * (I / I_param) * UI_Datas_Len
		#if STD_USING == STD_EUR  
				#define    I_thrhld_Adj                 I_2A_SelfRMS         //2.0f   
				#define    I_thrhld_over                I_3A_SelfRMS         //3.0f      //过流				       
				#define    I_thrhld_over_max            I_50A_SelfRMS        //50.0f     //最大过流值=40 * 1.25				
				#define    I_thrhld_short               I_5A_SelfRMS         //5.0f      //短路				    
				#define    I_thrhld_short_max           I_54A_SelfRMS        //54.0f     //最大短路值=40 * 1.35				
				#define    I_thrhld_fltChg              I_5A_SelfRMS         //2.0f      //浮充
				#define    I_thrhld_0                   I_02A_SelfRMS        //0.2f      //浮充 
        #define    I_tldRatio_over              IRatio_025_SelfRMS             //0.25f  
        #define    I_tldRatio_short             IRatio_035_SelfRMS             //0.35f       				
		#endif
		#define        I_limit_low                  I_F05A_SelfRMS              //-0.5f     
		#define        I_limit_high                 I_100A_SelfRMS     //100.0f 
	#endif
	
#elif (UI_Meter_Method == Meter_GuageIC_RN8209)
	// 算法：I / K_IRMS = I / 0.00000607315806369236
	#if STD_USING == STD_EUR  
			#define    I_thrhld_Adj                 I_2A_RN8209          // 2.0f
			#define    I_thrhld_over                I_3A_RN8209          //3.0f //过流			  
			#define    I_thrhld_over_max            I_50A_RN8209         //50.0f     //最大过流值 = 40 * 1.25			
			#define    I_thrhld_short               I_5A_RN8209          //5.0f      //短路			      
			#define    I_thrhld_short_max           I_54A_RN8209         //54.0f     //最大短路值 = 40 * 1.35			
			#define    I_thrhld_fltChg              I_5A_RN8209          //2.0f     //浮充
			#define    I_thrhld_0                   I_02A_RN8209         //0.2f      //接近0V阈值    
			#define    I_tldRatio_over              IRatio_025_RN8209
			#define    I_tldRatio_short             IRatio_035_RN8209
	#endif
	#define        I_limit_low                  I_F05A_RN8209          //-0.5f     
	#define        I_limit_high                 I_100A_RN8209          //100.0f   
	
#elif (UI_Meter_Method == Meter_GuageIC_RN8302B)
	// 算法：I / K_IRMS = I / 0.00000121407610151746
	#if STD_USING == STD_EUR  
			#define    I_thrhld_Adj                 I_2A_RN8302B         // 2.0f   
			#define    I_thrhld_over                I_3A_RN8302B         //3.0f //过流			    
			#define    I_thrhld_over_max            I_50A_RN8302B        //50.0f     //最大过流值 = 40 * 1.25			
			#define    I_thrhld_short               I_5A_RN8302B         //5.0f      //短路			    
			#define    I_thrhld_short_max           I_54A_RN8302B        //54.0f     //最大短路值 = 40 * 1.35			
			#define    I_thrhld_fltChg              I_5A_RN8302B         //5.0f     //浮充
			#define    I_thrhld_0                   I_02A_RN8302B        //0.2f      //接近0V阈值    
			#define    I_tldRatio_over              IRatio_025_RN8302B 
			#define    I_tldRatio_short             IRatio_035_RN8302B  
	#endif
	#define        I_limit_low                  I_F05A_RN8302B         //-0.5f     
	#define        I_limit_high                 I_100A_RN8302B         //100.0f

#endif

// 实数参数：电压：0.1V；电流：0.01A
#if meter485_ON > 0
    #if STD_USING == STD_EUR  
			#define    I_thrhld_Adj2                 I_2A_Mt485            // 2.0f   
			#define    I_thrhld_over2                I_3A_Mt485            //3.0f //过流			    
			#define    I_thrhld_over_max2            I_50A_Mt485           //50.0f     //最大过流值 = 40 * 1.25			
			#define    I_thrhld_short2               I_5A_Mt485            //5.0f      //短路			    
			#define    I_thrhld_short_max2           I_54A_Mt485           //54.0f     //最大短路值 = 40 * 1.35			
			#define    I_thrhld_fltChg2              I_5A_Mt485            //5.0f     //浮充
			#define    I_thrhld_02                   I_02A_Mt485           //0.2f      //接近0V阈值    
			#define    I_tldRatio_over2              IRatio_025_Mt485 
			#define    I_tldRatio_short2             IRatio_035_Mt485 
	#endif
	#define        I_limit_low2                  I_F05A_Mt485           //-0.5f     
	#define        I_limit_high2                 I_100A_Mt485           //100.0f
#endif

#define        thrhld_fltChg_tm             300000          //浮充充电的有效时间，5分钟都是浮充阶段，即确认浮充。5*60*1000
#define        Chging_Avail_tm              15000           //开始成电后,电流正常状态，并持续一段时间，算开启充电中。


// 电流状态判断：
#if PowerSupplyPhase == 3   //3相
	#define IS_I_state_short_circuit()   uiValues.I_value >= I_State_Flag.I_short_circuit && uiValues.I_value < I_limit_high || \
                                       uiValues.IB_value >= I_State_Flag.I_short_circuit && uiValues.IB_value < I_limit_high || \
                                       uiValues.IC_value >= I_State_Flag.I_short_circuit && uiValues.IC_value < I_limit_high
  #define IS_I_state_over_current()    uiValues.I_value < I_State_Flag.I_short_circuit && uiValues.I_value >= I_State_Flag.I_over_current || \
                                       uiValues.IB_value < I_State_Flag.I_short_circuit && uiValues.IB_value >= I_State_Flag.I_over_current || \
                                       uiValues.IC_value < I_State_Flag.I_short_circuit && uiValues.IC_value >= I_State_Flag.I_over_current
  #define IS_I_state_adjust()          uiValues.I_value < I_State_Flag.I_over_current && uiValues.I_value > I_State_Flag.I_adjust || \
                                       uiValues.IB_value < I_State_Flag.I_over_current && uiValues.IB_value > I_State_Flag.I_adjust || \
                                       uiValues.IC_value < I_State_Flag.I_over_current && uiValues.IC_value > I_State_Flag.I_adjust
  #define IS_I_state_normal()          uiValues.I_value <= I_State_Flag.I_adjust && uiValues.I_value > I_State_Flag.I_float_chg || \
                                       uiValues.IB_value <= I_State_Flag.I_adjust && uiValues.IB_value > I_State_Flag.I_float_chg || \
                                       uiValues.IC_value <= I_State_Flag.I_adjust && uiValues.IC_value > I_State_Flag.I_float_chg
  #define IS_I_state_float_chg()       uiValues.I_value <= I_State_Flag.I_float_chg && uiValues.I_value > I_thrhld_0 || \
                                       uiValues.IB_value <= I_State_Flag.I_float_chg && uiValues.IB_value > I_thrhld_0 || \
                                       uiValues.IC_value <= I_State_Flag.I_float_chg && uiValues.IC_value > I_thrhld_0
  #define IS_I_state_stop_chg()        uiValues.I_value <= I_thrhld_0 || uiValues.IB_value <= I_thrhld_0 || uiValues.IC_value <= I_thrhld_0 
#else
  #define IS_I_state_short_circuit()   uiValues.I_value >= I_State_Flag.I_short_circuit && uiValues.I_value < I_limit_high 
  #define IS_I_state_over_current()    uiValues.I_value < I_State_Flag.I_short_circuit && uiValues.I_value >= I_State_Flag.I_over_current 
  #define IS_I_state_adjust()          uiValues.I_value < I_State_Flag.I_over_current && uiValues.I_value > I_State_Flag.I_adjust 
  #define IS_I_state_normal()          uiValues.I_value <= I_State_Flag.I_adjust && uiValues.I_value > I_State_Flag.I_float_chg 
  #define IS_I_state_float_chg()       uiValues.I_value <= I_State_Flag.I_float_chg && uiValues.I_value > I_thrhld_0  
  #define IS_I_state_stop_chg()        uiValues.I_value <= I_thrhld_0
#endif

// 智能电表电流状态判断：
#if meter485_ON  > 0
  #if PowerSupplyPhase == 3   //3相
		#define IS_I_state_short_circuit2()   uiValues2.I_value >= I_State_Flag.I_short_circuit2 && uiValues2.I_value < I_limit_high || \
																				 uiValues2.IB_value >= I_State_Flag.I_short_circuit2 && uiValues2.IB_value < I_limit_high || \
																				 uiValues2.IC_value >= I_State_Flag.I_short_circuit2 && uiValues2.IC_value < I_limit_high
		#define IS_I_state_over_current2()    uiValues2.I_value < I_State_Flag.I_short_circuit2 && uiValues2.I_value >= I_State_Flag.I_over_current2 || \
																				 uiValues2.IB_value < I_State_Flag.I_short_circuit2 && uiValues2.IB_value >= I_State_Flag.I_over_current2 || \
																				 uiValues2.IC_value < I_State_Flag.I_short_circuit2 && uiValues2.IC_value >= I_State_Flag.I_over_current2
		#define IS_I_state_adjust2()          uiValues2.I_value < I_State_Flag.I_over_current2 && uiValues2.I_value > I_State_Flag.I_adjust2 || \
																				 uiValues2.IB_value < I_State_Flag.I_over_current2 && uiValues2.IB_value > I_State_Flag.I_adjust2 || \
																				 uiValues2.IC_value < I_State_Flag.I_over_current2 && uiValues2.IC_value > I_State_Flag.I_adjust2
		#define IS_I_state_normal2()          uiValues2.I_value <= I_State_Flag.I_adjust2 && uiValues2.I_value > I_State_Flag.I_float_chg2 || \
																				 uiValues2.IB_value <= I_State_Flag.I_adjust2 && uiValues2.IB_value > I_State_Flag.I_float_chg2 || \
																				 uiValues2.IC_value <= I_State_Flag.I_adjust2 && uiValues2.IC_value > I_State_Flag.I_float_chg2
		#define IS_I_state_float_chg2()       uiValues2.I_value <= I_State_Flag.I_float_chg2 && uiValues2.I_value > I_thrhld_02 || \
																				 uiValues2.IB_value <= I_State_Flag.I_float_chg2 && uiValues2.IB_value > I_thrhld_02 || \
																				 uiValues2.IC_value <= I_State_Flag.I_float_chg2 && uiValues2.IC_value > I_thrhld_02
		#define IS_I_state_stop_chg2()        uiValues2.I_value <= I_thrhld_02 || uiValues2.IB_value <= I_thrhld_02 || uiValues2.IC_value <= I_thrhld_02 
	#else
		#define IS_I_state_short_circuit2()   uiValues2.I_value >= I_State_Flag.I_short_circuit2 && uiValues2.I_value < I_limit_high 
		#define IS_I_state_over_current2()    uiValues2.I_value < I_State_Flag.I_short_circuit2 && uiValues2.I_value >= I_State_Flag.I_over_current2 
		#define IS_I_state_adjust2()          uiValues2.I_value < I_State_Flag.I_over_current2 && uiValues2.I_value > I_State_Flag.I_adjust2 
		#define IS_I_state_normal2()          uiValues2.I_value <= I_State_Flag.I_adjust2 && uiValues2.I_value > I_State_Flag.I_float_chg2 
		#define IS_I_state_float_chg2()       uiValues2.I_value <= I_State_Flag.I_float_chg2 && uiValues2.I_value > I_thrhld_02  
		#define IS_I_state_stop_chg2()        uiValues2.I_value <= I_thrhld_02
	#endif
#endif


///////////////////////////////// 充电错误处理与恢复 ///////////////////////////////////
////// 电流错误 //////
// 电流状态有效的持续时间
#define    IState_availTm                500     // 检测时间：3秒以内即可
// 过流持续时间：然后停冲
#define    IState_over_prt               1000    
// 停冲后，恢复间隔时间：
#define    IState_over_recv              8000    
// 过流允许恢复次数：
#define    IOvState_recv_tms             2
// 过流调整：过流超过10秒,调整一下数据;
#define    IAdj_intv                     10000 
// 短路坚持时间，然后时间一过就停充;
#define    IState_short_prst             4000 

////// 电压错误 //////
// 电压状态持续有效时间
#define      U_Change_Tm_avail           500
#if Volt_Protection > 0
  // 电压持续时间
	#define      U_Wait_TmEnd              3000
	// 电压恢复时间
	#define      U_Recv_TmEnd              8000 	
#endif

////// 温度错误 //////
// 温度状态有效的持续时间
#define    tmprState_availTm             1000
#define    tmpr_WaitTm                   60000
#define    tmpr_Recv_WaitTm              1200000  // 20分钟，自动恢复
// 过温调整次数限制：
#define    tmpr_adj_tms                  1

///// 接地错误   ///////
//有效时长 = 5s
#define PE_Available_tm                   10000
// 故障持续时间
#define PE_wait_tmEnd                     5000
// 恢复期
#define PE_Recover_tmEnd                  30000

/////// 继电器检测  ///////
#if RlyAdh_Detect_type > 0
#define RlyAdh_Available_tm               3000              // 继电器多长时间检测不到0，算继电器粘连;
#endif


//////////////////////////////////////////// 滤波相关 ///////////////////////////////////////////////////
#define  filter_CP_coeff_bit                 0      //CP滤波系数,0-1。filter_coeff_bit滤波系数等级,位数。1=1/2，2=1/4，3=1/8;
#define  filter_Tmpr_coeff_bit               2      //温度滤波系数:2, filter_coeff_bit滤波系数等级,位数。1=1/2，2=1/4，3=1/8;
#define  filter_UI_coeff_bit                 0      //UI滤波系数,0-1。filter_coeff_bit滤波系数等级,位数。1=1/2，2=1/4，3=1/8;
#define  order_of_filter                     2//1      //3阶滤波,刚好合适。
#if filter_UI_coeff_bit == 0
#define  filter_UIShow_coeff_bit             2//0      //电流电压float滤波
#endif

//偏移误差：
#if (UI_Meter_Method == Meter_SelfADC)
	#if (GET_UI_METHOD_ID == UI_METHOD_MAX)
    #define  filter_IOffset                  I_03A_SelfMax 
  #endif
#endif	

/////////////////////////////////////   PWM相关   ///////////////////////////////////// 
// PWM数据结构体
struct PWM_Param{
	  uint16_t ratedDuty;  //占空比变量: 单位：千分之一; pwmDuty = 254,则占空比=25.4% 
    uint16_t pwmDuty; 
    uint16_t pwmDutyPre; 
};

////////////////////////////  带磁铁的插座，选择额定电流的参数  ////////////////////////
#if PinPick_RatedI > 0
	#if I_rated_count > 1
		#define  pinLevel_L_indx        1            // 低电平额定值id, 16A的id, 不带磁铁
		#define  pinLevel_H_indx        0
	#endif
#endif


//////////////////////////////////////////////////   充电额定电流   ///////////////////////////////////////////////////
#define    DUTY_CYCLE_MIN               100                 //充电占空比最小值
#define    DUTY_CYCLE_stop              1000                //停止充电的占空比
#define    Duty_Adj_Step                16                  //1A对应的的占空比
#if I_rated_count >  1
	// 额定充电电流列表; 其所对应的额定数据;
	#if (UI_Meter_Method == Meter_SelfADC)
		#if (GET_UI_METHOD_ID == UI_METHOD_MAX)
		  #if CHGR_panel_Sel == CHGR_panel_B14 && PinPick_RatedI > 0
				#define    I_rated_Arr                  { I_10A_SelfMax, I_16A_SelfMax }                       // { 10.0f,  16.0f }
			#else
				#define    I_rated_Arr                  { I_8A_SelfMax, I_10A_SelfMax, I_16A_SelfMax }          // { 8.0f,   10.0f,  16.0f }
				//#define    I_rated_Arr                  { I_6A_SelfMax, I_8A_SelfMax, I_10A_SelfMax }
			#endif
		#elif (GET_UI_METHOD_ID == UI_METHOD_RMS)
			#define    I_rated_Arr                  { I_8A_SelfRMS, I_10A_SelfRMS, I_16A_SelfRMS }            // { 8.0f,   10.0f,  16.0f }
		#endif
	#elif (UI_Meter_Method == Meter_GuageIC_RN8209)
		#define    I_rated_Arr                    { I_8A_RN8209, I_10A_RN8209, I_16A_RN8209 }                // { 8.0f,   10.0f,  16.0f }
	#elif (UI_Meter_Method == Meter_GuageIC_RN8302B)
		#define    I_rated_Arr                    { I_8A_RN8302B, I_10A_RN8302B, I_16A_RN8302B }             // { 8.0f,   10.0f,  16.0f }
	#endif
	#if CHGR_panel_Sel == CHGR_panel_B14 && PinPick_RatedI > 0
		#define    I_rated_Arrf                 {10.0f,  16.0f }
		#define    DUTY_CYCLE_Arr               {167,    267   }  
  #else			
		#define    I_rated_Arrf                 { 8.0f,   10.0f,  16.0f }
		#define    DUTY_CYCLE_Arr               { 133,    167,    267   }  // I / 0.6
	#endif
#else
	#if (UI_Meter_Method == Meter_SelfADC)
		#if (GET_UI_METHOD_ID == UI_METHOD_MAX)
			#define    I_rated_default             I_16A_SelfMax               //10.0f //32.0f // 10A额定充电电流，对应的原始数据
		#elif (GET_UI_METHOD_ID == UI_METHOD_RMS)
			#define    I_rated_default             I_16A_SelfRMS               //10.0f //32.0f // 10A额定充电电流，对应的原始数据
		#endif
	#elif (UI_Meter_Method == Meter_GuageIC_RN8209)
		#ifdef SQDri_EVSEB_7KW
		#define    I_rated_default               I_32A_RN8209                //10.0f //32.0f // 10A额定充电电流，对应的原始数据 
		#else
		#define    I_rated_default               I_10A_RN8209                //10.0f //32.0f // 10A额定充电电流，对应的原始数据
		#endif
	#elif (UI_Meter_Method == Meter_GuageIC_RN8302B)
	  #ifdef SQDri_EVSEB_11KW
		#define    I_rated_default               I_16A_RN8302B               //10.0f //32.0f // 10A额定充电电流，对应的原始数据
		#elif defined SQDri_EVSEB_22KW
		#define    I_rated_default               I_32A_RN8302B               //10.0f //32.0f // 10A额定充电电流，对应的原始数据
		#else
		#define    I_rated_default               I_10A_RN8302B               //10.0f //32.0f // 10A额定充电电流，对应的原始数据 			
	  #endif
	#endif
	#if defined SQDri_EVSEB_7KW || defined SQDri_EVSEB_22KW
	  #define    I_rated_defaultf             32
		#define    DUTY_CYCLE_default           533                            //533   
	#elif defined SQDri_EVSEB_11KW
		#define    I_rated_defaultf             16
		#define    DUTY_CYCLE_default           267                            //533   
	#else
	  #define    I_rated_defaultf             16
		#define    DUTY_CYCLE_default           267                            // I / 0.6   
  #endif  
#endif

// 智能电表的数据：
#if meter485_ON > 0
	#if I_rated_count >  1
		// 额定充电电流列表; 其所对应的额定数据;
		#if CHGR_panel_Sel == CHGR_panel_B14 && PinPick_RatedI > 0
			#define    I_rated_Arr2                  { I_10A_Mt485, I_16A_Mt485 }                               // { 10.0f,  16.0f }
		#else
			#define    I_rated_Arr2                  { I_8A_Mt485, I_10A_Mt485, I_16A_Mt485 }                   // { 8.0f,   10.0f,  16.0f }
		#endif
	#else
		#if (UI_Meter_Method == Meter_SelfADC)
			#if (GET_UI_METHOD_ID == UI_METHOD_MAX)
				#define    I_rated_default2             I_10A_Mt485               //10.0f //32.0f // 10A额定充电电流，对应的原始数据
			#elif (GET_UI_METHOD_ID == UI_METHOD_RMS)
				#define    I_rated_default2             I_10A_Mt485               //10.0f //32.0f // 10A额定充电电流，对应的原始数据
			#endif
		#elif (UI_Meter_Method == Meter_GuageIC_RN8209)
			#ifdef SQDri_EVSEB_7KW
			#define    I_rated_default2               I_32A_Mt485                //10.0f //32.0f // 10A额定充电电流，对应的原始数据 
			#else
			#define    I_rated_default2               I_10A_Mt485                //10.0f //32.0f // 10A额定充电电流，对应的原始数据
			#endif
		#elif (UI_Meter_Method == Meter_GuageIC_RN8302B)
			#ifdef SQDri_EVSEB_11KW
			#define    I_rated_default2               I_16A_Mt485               //10.0f //32.0f // 10A额定充电电流，对应的原始数据
			#elif defined SQDri_EVSEB_22KW
			#define    I_rated_default2               I_32A_Mt485               //10.0f //32.0f // 10A额定充电电流，对应的原始数据
			#else
			#define    I_rated_default2               I_10A_Mt485               //10.0f //32.0f // 10A额定充电电流，对应的原始数据 			
			#endif
		#endif
	#endif
#endif


//////////////////////////////////////////////////   ADC相关计算   //////////////////////////////////////////////////////
// 获取数据函数：
//#define    getCPValue()           cp_data.CP_Value = getArrayAverage(CP_Datas_Peak,CP_Datas_Peak_Len) * 3.3f * 4 / 4095
#define    getCPValue()             cp_data.CP_Value = cp_data.ADC_Data * 1.0f / 4095 * 3.3f * CP_Amplifier 
//#define    getCPValue()             cp_data.CP_Value = (ADC_Value[ADC_CP] & 0XFFFF) * 1.0f / 4095 * 3.3f * CP_Amplifier 

//#define    getVrefValue()           Vref = 	((ADC_Value[1] & 0XFFFF0000) >> 16) *3.3f / 4095

// 板内温度计算
#define    getTMP_BoardIn_R()       TMP_BoardIn_R = ADC_Buffer.ADC_Item.ADCValue_TEMPR_BoardIn;
#define    getTMP_BoardIn() 	      TMP_BoardIn  =  TMP_BoardIn_R * 3.3 / 4095;    \
                                    TMP_BoardIn  =  TMP_BoardIn / (3.3 - TMP_BoardIn) * Rptl_TMP_BoardIn;  \
																		TMP_BoardIn  =  (1 / (log(TMP_BoardIn / R0_ntc) / B_ntc + 1 / T0_ntc)) - Kd_0
// 板内外接温度计
#define    getTMP_Ext1_R()          TMP_Ext1_R   =  ADC_Buffer.ADC_Item.ADCValue_TEMPR_External;
#define    getTMP_Ext1()            TMP_Ext1     =  TMP_Ext1_R * 3.3 / 4095;    \
                                    TMP_Ext1     =  TMP_Ext1 / (3.3 - TMP_Ext1) * Rptl_TMP_Ext1;  \
																		TMP_Ext1     =  (1 / (log(TMP_Ext1 / R0_ntc) / B_ntc + 1 / T0_ntc)) - Kd_0
																		
// 枪温检测：
#define    getTMP_Ext2_R()          TMP_Ext2_R   =  ADC_Buffer.ADC_Item.ADCValue_TEMPR_ChgGun;
#define    getTMP_Ext2()            TMP_Ext2     =  TMP_Ext2_R * 3.3 / 4095;    \
                                    TMP_Ext2     =  TMP_Ext2 / (3.3 - TMP_Ext2) * Rptl_TMP_Ext2;  \
																		TMP_Ext2     =  (1 / (log(TMP_Ext2 / R0_ntc) / B_ntc + 1 / T0_ntc)) - Kd_0
		
#define    getTMP_IC()              TMP_IC       =  ((ADC_Buffer.ADC_Item.ADCValue_TEMPR_MCU & 0XFFFF0000) >> 16)  * 3.3f / 4095; \
                                    TMP_IC       =   (V25_TMP_IC - TMP_IC) / Avg_Slope_TMP_IC + 25

// 函数宏定义；
#define    errFloatValue            0.001f        
#define    isFloatSame(a,b)         fabsf(a - b) < errFloatValue   

#if (GET_K_Actv != 0) || (Get_QOE_Method == Meter_SelfADC)
#define    pi                        3.1415926535
#define    PF_nomal                  0.9
// ws单位转0.01KWh的系数：0.00002777777777777778 * (误差系数=1.024276) = 0.000028452121336257 
#define    K_KWh2WS                  0.000028452121336257      

// 电量保存频率：充电时候保存
#define    QOE_save_ticks            30000                       // 30000*10ms = 300000ms = 300s = 5分钟
#endif

// 电压电流计算公式
//#define    getTMP_U_Avail()       U_Avail =  sqrt(getSquareSum(U_datas,UI_Datas_Len) / UI_Datas_Len) * U_param
//#define    getTMP_I_Avail()       I_Avail =  sqrt(getSquareSum(I_datas,UI_Datas_Len) / UI_Datas_Len) * I_param
//#define    getTMP_U_Avail()       U_Avail =  sqrt(uiValues.U_value / UI_Datas_Len) * U_param
//#define    getTMP_I_Avail()       I_Avail =  sqrt(uiValues.I_value / UI_Datas_Len) * I_param
#if (GET_UI_METHOD_ID == UI_METHOD_MAX)	
	#if filter_UIShow_coeff_bit  > 0
		#define    getTMP_U_Avail()       UI_Data.U_RMS =  uiValues.Ulb_value[order_of_filter-1] * U_param_ext
		#define    getTMP_I_Avail()       UI_Data.I_RMS =  uiValues.Ilb_value[order_of_filter-1] * I_param_ext	
	#else
		#define    getTMP_U_Avail()       UI_Data.U_RMS =  uiValues.U_value * U_param_ext
		#define    getTMP_I_Avail()       UI_Data.I_RMS =  uiValues.I_value * I_param_ext	
	#endif
#elif (GET_UI_METHOD_ID == UI_METHOD_RMS)  
	#if filter_UIShow_coeff_bit  > 0
		#define    getTMP_U_Avail()       UI_Data.U_RMS =  sqrt(uiValues.Ulb_value[order_of_filter-1] / (UI_Datas_Len/2)) * U_param_adj
		#define    getTMP_I_Avail()       UI_Data.I_RMS =  sqrt(uiValues.Ilb_value[order_of_filter-1] / (UI_Datas_Len/2)) * I_param_adj
	#else
		#define    getTMP_U_Avail()       UI_Data.U_RMS =  sqrt(uiValues.U_value / (UI_Datas_Len/2)) * U_param_adj
		#define    getTMP_I_Avail()       UI_Data.I_RMS =  sqrt(uiValues.I_value / (UI_Datas_Len/2)) * I_param_adj
	#endif
#endif


/////////////////////////////////////////// CP控制相关：////////////////////////////////////////////
// CP数据结构体
struct CP{
    // 有回差的参数，以及更细致的CP状态判定;
	  #if AUTHEN_CE > 0
	  uint8_t  cp_up_or_down;              //CP变化方向，向上or向下。向上6-9-12，下12-9-6; 初值=cp_Direc_Down 
		#endif	
	  //uint8_t  CP_Busy;                 //CP状态处理忙
	  uint8_t  value_cope_id;             //cp值范围编号：上电初始化为：0
	  uint8_t  value_cope_id_pre;         //上一次的CP值id; 初值=0	
	  uint8_t  cp_state;                  //cp状态
	  uint8_t  cp_state_sub;              //cp状态的子状态
	  uint8_t  cp_state_pre;              //cp前一刻状态
	  uint8_t  cp_state_treat;            //已经处理过了的CP状态
	  uint8_t  CP_Jump_tms;               //cp跳变次数计数变量：cp6V与非6V之间反复跳变，> 50次算异常。防止出现机关枪，及时报错
	  uint16_t ADC_Data;                  //CP的ADC读数
	  float    CP_Value;                  //CP电压值,单位=V
	  // uint64_t CP0_start_Tm;           //cp0状态开始的时间，继续一段时间后，方能判断CP0异常
	  uint64_t CP_idChg_Tm;               // CP值id变更的开始时间; 9V 与 12V 算同一档;
	  uint64_t CP_9_12_Chg_Tm;            // 9V 与 12V坚持时间;
    uint8_t  CP_State_Post_delay;       // CP处理n次，进行一次CP后处理;	
};
// CP后处理参数
#define CP_State_Post_delay_default     5

// CP_id值
#define       CP_12                  12
#define       CP_9                   9
#define       CP_6                   6
#define       CP_0                   0

// CP状态
enum CP_STATE{
	  NO_PLUGGED = 1,
	  PLUGGED,
	  BE_CHARGING,
	  CP_ERROR,
    PLUG_IN,
    PLUG_OUT,
    CHG_Strt,
    CHG_Fini,    
	  CP_STATE_NUMS
};

// CP 数据表：CP原始数据计算方法：
// // CP电压对应的ADC：Vadc = Vcp * 4095 / (3.3 * A);  分压系数A = (100 + 300) / 100 = 4; 100,300=分压电阻。
#define     cp_10V7_ADC                3319       // 10.7f
#define     cp_10V4_ADC                3226       // 10.4f
#define     cp_7V7_ADC                 2389       // 7.7f
#define     cp_7V5_ADC                 2327       // 7.5f
#define     cp_1V9_ADC                 589        // 1.9f
#define     cp_1V7_ADC                 527        // 1.7f
#define     cp_0V5_ADC                 155        // 0.5f
#define     cp_0V3_ADC                 93         // 0.3f
#define     cp_0V1_ADC                 31         // 0.1f		

// CP状态阈值数据
// CP电压对应的ADC：Vadc = Vcp * 4095 / (3.3 * A);  分压系数A = (100 + 300) / 100 = 4; 100,300=分压电阻。
#if AUTHEN_CE > 0  
		#define     cp_UP12V_low                cp_10V7_ADC      // 10.7f
		#define     cp_UP9V_high                cp_10V7_ADC      // 10.7f
		#define     cp_UP9V_low                 cp_7V7_ADC       // 7.7f
		#define     cp_UP6V_high                cp_7V7_ADC       // 7.7f
		#define     cp_UP6V_low                 cp_1V9_ADC       // 1.9f
		#define     cp_UP0V_high                cp_1V9_ADC       // 1.9f
		
		#define     cp_Dn12V_low                cp_10V4_ADC      // 10.4f
		#define     cp_Dn9V_high                cp_10V4_ADC      // 10.4f
		#define     cp_Dn9V_low                 cp_7V5_ADC       // 7.5f
		#define     cp_Dn6V_high                cp_7V5_ADC       // 7.5f
		#define     cp_Dn6V_low                 cp_1V7_ADC       // 1.7f 
		#define     cp_Dn0V_high                cp_1V7_ADC       // 1.7f
		
		enum CP_Direc{
			  cp_Direc_Down,
			  cp_Direc_UP,
		};
#else
		#define     cp_12V_low                  cp_10V4_ADC         // 10.4f
		#define     cp_9V_high                  cp_10V4_ADC         // 10.4f
		#define     cp_9V_low                   cp_7V5_ADC          // 7.5f
		#define     cp_6V_high                  cp_7V5_ADC          // 7.5f
		#define     cp_6V_low                   cp_1V9_ADC          // 1.9f
		#define     cp_0V_high                  cp_1V9_ADC          // 1.9f		
#endif
#define         cp_0V_low                   cp_0V3_ADC          // 0.3f

// 现实中CP读数最大值；超过则是错误数据；= 100/3.3*4095/CP_Amplifier
#define         CP_ADC_Limit                31023        

// CP 变更后的有效时间；
#define     CP_Change_Tm_avail            50
#define     CP_err_Tm_avail               60
// CP 细致状态时间，稳定态时间，比如拔枪，插枪等。他是瞬间态，一段时间后，就变成 NO_PLUGGED
#define     CPState_Stable_Tm             20000
// 插满枪状态持续时间;
#define     CPState_ChgFini_Stable_Tm     600000    //坚持10分钟;
// CP跳变最大次数
#define     CP_Jump_max_tms               250        //50; 最大值255次;


/////////////////////////////////////////// 漏电流参数：///////////////////////////////////////////////
struct Leakage_Ctrl{
    uint8_t    leak_tms;                   // 检测到漏电的次数	  
	  
	  #if RCD_TYPE_B > 0
	  uint8_t leak_test_init_step;           // B漏电互感器自检步骤变量
	  uint64_t   leakSelfTest_start_tm;      // 漏电自检开始时间
	  
	  #if leak_testSelf_get > 0
	  uint8_t leak_testSelf_occs;
	  #endif
	
	  #endif
};
// 漏电持续时间：
#define    leakage_Avail_tms              2         //检测到漏电信号次数有效值，大于此值算漏电处理; 默认 5
// 漏电互感器芯片初始化时序参数
#if RCD_TYPE_B > 0
	#if testSelfLeak == Leak_RCPD_08BS75_2P2
		// 漏电自检参数:
		#define    leak_step1_tm                  120   //120
		#define    leak_step2_tm                  240   //200  //leak_step1_tm + 50 = 170
		#define    leak_step3_tm                  3500  //200  //leak_step1_tm + 50 = 170
		#define    leak_step4_tm                  4500  //200  //leak_step1_tm + 50 = 170
		#define    Leak_Step_max                  5
		#define    leak_stepLast_tm               4500

	#elif testSelfLeak == UIFG_R10x_3A 
		// 漏电自检参数:
		#define    leak_step1_tm                  1200   //1200
		#define    leak_step2_tm                  2000   //800   //leak_step1_tm + 800 = 2000
		#define    leak_step3_tm                  3000   //1000  //leak_step2_tm + 1000 = 3000
		#define    leak_step4_tm                  4000   //1000  //leak_step3_tm + 1000 = 4000
		#define    Leak_Step_max                  5
		#define    leak_stepLast_tm               4000

	#elif testSelfLeak == Leak_FM2161A
		// 漏电自检时序参数
		#define    Leak_step_t1                   300     // 上电完成后的等待时间 T1≥120ms; 300         
		#define    Leak_step_t2                   700     // 300+400; // CLBI 校准持续时间 T2≥240ms; 400
		#define    Leak_step_t3                   750     // 300+400+50; // 等待时间 T3≥5ms; 50
		#define    Leak_step_t4                   900     // 300+400+50+150;// STIN 自检持续时间 T4≥60ms; 150
		#define    Leak_step_t5                   1100    // 300+400+50+150+200;// 在 STIN 产生上升沿时， SCR 高电平的保持时间为 T6=20ms;100
		#define    Leak_Step_max                  7
		#define    leak_stepLast_tm               4000   // >= t1 + t2 + t3 + t4 + t6 = 630
	#endif
#endif

///// 汽车二极管检测 //////
#define CarD1_Available_tm                3000
#define CarD1_MarkNum_Avail               1000    //持续1秒的低电平,则可认为二极管有问题
struct CarD1_param{
	  uint64_t   CarD1_TestStart;             //自检开始时间
	  uint16_t   CarD1_MarkNum;               //检测期间：检测到1的次数; 或 下降沿次数;
};
#if CarD1_Detect_Tyte == CarD1_Detect_EINT
#define CarD1_Bad_Fall_edge_num           160
#endif

/////////////////////////////////////////////////   按键   ///////////////////////////////////////////////
// 按键数据结构体
#if Key1 > 0
typedef struct{
	  //int8_t keyLevel;       // 按键电平记录;
	  int8_t keyState;        // 按键状态：自锁按键：1=松开，0=按下。非自锁：-1 = 长按; 0 = 单击；n:连击n+1下; -2 = 松开一段时间; -3 = 长按触发	
		uint64_t keyChangeUpTms;  // 按键松开抬起的时间
	  #if Key_longCtl > 0
	  uint64_t keyDownTms;    // 按键按下的时间
	  #endif
	  #if Key_longCtl > 0 || Key_doubleCtl > 0
	  uint64_t keyUpTms;      // 按键松开抬起时间	  
	  #endif
}key_param;
#endif

///////////////////////////////////////////// Led闪灯控制参数  ////////////////////////////////////////////
// 开机效果时间控制：
#define  ledStartUpBlinkTime              800
#define  ledStartUpHoldDarkTime           500
#if beep_type > 0
// 开机蜂鸣器响一下
#define  startBeepTime                    300
#endif //beep_type > 0

////////////////////////////////////////// 自检项：没有错误方能充电  //////////////////////////////////////
// 自检位：
#define  chg_selfCheck_CarD1                0x01     // 第一项自检，车载二极管
#if leak_testSelf_get > 0
	#define  chg_selfCheck_Leak               0x02     // 第二位自检项，A+6漏电互感器自检。
#endif

// 自检完毕值：
#if leak_testSelf_get > 0
	#define  chg_selfCheck_SUM                0x03     // chg_selfCheck_CarD1 | chg_selfCheck_Leak | 其他项
#else
	#define  chg_selfCheck_SUM                0x01     // chg_selfCheck_CarD1 | 其他项
#endif


// 错误代码：
enum FaultCodeType{
	  cp_fault = 1,           //1
    low_voltage,            //2
		over_voltage,           //3
		PE_protection,          //4
		over_current,           //5
		short_circuit,          //6
		leakage,                //7
		over_tempr,             //8
		Istate_adjust,          //9       //电流调整
		carD1_bad,              //10      //车端二极管损坏
		relay_adhesion,         //11      //继电器粘接
		tmpr_boardIn_e,         //12      //pcb板内传感器坏了;
		I_data_e,               //13      //电流值有问题;
		U_data_e,               //14      //电压值有问题;
		tmpr_adjust_err,        //15      //温度调整
		flash_err,              //16      //flash错误
	  emergency_stop          //17      //急停按钮被按
	 	  
};


// 自定义任务参数:
// 任务位定义:0 = 第一个任务；任务定时器定时：10ms;
#define     mTaskMainFreq               10   //主程序运行频次；10*10ms=100ms
#define     mTaskFaultFreq              50   //错误处理运行频次；50*10ms=500ms
#define     EintFreq                    5    //中断检测运行频次；5*10ms =50ms
#define     CarD1EintFreq               5    //PWM比较中断检测运行频次；5*10ms=50ms
// 开启充电n秒后，关闭继电器启动的引脚，仅留维持引脚保持充电。
#if Has_RlyPin_Maintaining > 0
	#define   Rly_PinStartup_Timeout      5000 //30秒开启时间; 
#endif

// 停充时间
#define     EvStopChgTimer               1000   // 1000*10ms = 10000ms

#if Using_UART_LCD == LCD_0P42_IIC
// IIC 相关
#define iicBufferSize                     20
// OLed相关
#define     refreshOledFreq               100  // 屏幕刷新频次：100*10ms = 1s
#define     refreshOledDataFreq           3    // 屏幕数据刷新频次：1s * 3 = 3s

#elif Using_UART_LCD == LCD_4P3_UART
	#define     refreshLCDDataFreq          100  // LCD屏幕数据刷新频次：100*10ms = 1s
	#define     refreshLCDData_timeSeg      11
	
#endif
#if Using_UART_LCD == LCD_4P3_UART ||  BleWifi_type == BleWifi_Ai_WB2
  // 电量显示的小数点位数系数
	#define     QOE_Dec_Places_1            10    // 1位小数点：显示单位 = 0.1度
	#define     QOE_Dec_Places_2            1     // 2位小数点：显示单位 = 0.01度
#endif

// 任务列表
//#define     mTask_keyRev_bit             0x0001     //  (0x0001 << 0)                    
//#define     mTask_keyWait_bit            0x0002     //  (0x0001 << 1)              
#define     mTask_ledStartUp_bit         0x0004       //  (0x0001 << 2) 
// 灯闪烁
#define     mTask_ledBlink_bit           0x0008     //  (0x0001 << 3)
#ifdef LedCtrl_Rolling
// 滚动效果
#define     mTask_ledRoll_bit            0x0010     //  (0x0001 << 4)
#endif
#define     mTask_initStartUp_bit        0x0020     //  (0x0001 << 5)
#if proactive_chgStop_EN > 0 || PlugCharge_And_Resv
	#define     mTask_initChgStop_bit      0x0040     //  (0x0001 << 6)
#endif

// 流程类的延时定义
#define    oled_reset_step1_delay        200

// SPI常量
#if (UI_Meter_Method > Meter_SelfADC)
// SPI传递rn8209数据缓存 
#define SPI_DATA_SIZE                    6
#endif
// 读取UI的频率，2秒读取一次;  read_UI_intv = 2000ms / 10 = 200 
#define read_UI_intv                     50  

#if (Get_QOE_Method == Meter_SelfADC)
// 计算电量累计的时间间隔
#define compuQOETick                     100       // 100 * 10 = 1000ms=1秒一次。
#endif


///////////////////////////////////////// 数据格式定义 ///////////////////////////////////////
#ifdef UsingFreeRTOS
// 消息类型：keyDownMsg = 按键消息; faultMsg = 错误消息; 
enum  MsgType{
	  keyDownMsg,
	  faultMsg,
	  
};
#endif
// 电流电压的原始参数
typedef struct{
	  uint32_t  U_value;
		uint32_t  I_value;
	  #if order_of_filter > 0
	  uint32_t  U_value_lb[order_of_filter];
		uint32_t  I_value_lb[order_of_filter];
	  #endif
	  #if filter_UIShow_coeff_bit > 0
	  uint32_t  Ulb_value[order_of_filter];
		uint32_t  Ilb_value[order_of_filter];
	  #endif
	  #if UI_Meter_Method > Meter_SelfADC
	  int32_t   PWR_RMS;     // A相有功功率
	  uint32_t  QOE_value;   
	  #endif
		#if PowerSupplyPhase == 3
			uint32_t  UB_value;
			uint32_t  IB_value;
			uint32_t  UC_value;
			uint32_t  IC_value;
      int32_t   PWRB_RMS;  // B相有功功率
			int32_t   PWRC_RMS;  // C相有功功率
			int32_t   PWRT_RMS;	// 合相有功功率 	
		#endif
}UI_PARAM;

// 输出电流电压参数
typedef struct{
	  uint8_t meterReady; //传感器准备完毕,可以采集数据。
	  float  U_RMS;       // 电压有效值
	  float  I_RMS;       // 电流有效值
	  #if PowerSupplyPhase == 3
			float  UB_RMS;    // 电压有效值
			float  IB_RMS;    // 电流有效值
			float  UC_RMS;    // 电压有效值
			float  IC_RMS;    // 电流有效值
	  #endif
	
	  // 功率电量相关
	  #if (GET_K_Actv != 0) || (UI_Meter_Method > Meter_SelfADC)  || (Get_QOE_Method == Meter_SelfADC)
			float  P_actv;         // L1有功功率：实在消耗的能量。单位=W。 
	    #if PowerSupplyPhase == 3
      float  PB_actv;         // L2有功功率：实在消耗的能量。单位=W。
      float  PC_actv;         // L3有功功率：实在消耗的能量。单位=W。
      float  PT_actv;         // 合相有功功率：实在消耗的能量。单位=W。
      #endif	
	    float  Papt;           // 合相视在功率 = apparent power
			float  PF_pow;         // 功率因子
			float  QOE;            // 电量; 单位 = 0.01度电
			float  QOE_ChgStart;   // 本次充电的起始电量
	  #endif
		
    #if UI_Meter_Method > Meter_SelfADC
			float  P_reactv;            // 无功功率 
			float  QOE_reactv;          // 无功电能
			uint8_t QOE_IFTimes;        // 有功电能翻转次数
			uint8_t QOE_reactv_IFTimes; // 无功电能翻转次数
    #endif	
} UI_Meter;

// 电流控制参数
struct I_Ctrl_Flag{
	  uint32_t  I_rated_value;      // 充电的额定值对应的阈值;	  
		uint32_t  I_adjust;           // 电流调整值对应的阈值;
		uint32_t  I_over_current;     // 电流过流值对应的阈值;
		uint32_t  I_short_circuit;    // 电流短路值对应的阈值;
		uint32_t  I_float_chg;        // 电流浮充值对应的阈值;
	  #if meter485_ON > 0
	  uint32_t  I_rated_value2;      // 充电的额定值对应的阈值; 
	  uint32_t  I_adjust2;           // 电流调整值对应的阈值;
		uint32_t  I_over_current2;     // 电流过流值对应的阈值;
		uint32_t  I_short_circuit2;    // 电流短路值对应的阈值;
		uint32_t  I_float_chg2;        // 电流浮充值对应的阈值;
	  #endif
	  float     I_rated_valuef;     // 充电的额定值;
};

struct I_Ctrl{
	  uint8_t   I_state;            //I状态
    uint8_t   I_state_pre;        //I瞬时状态
		uint64_t  Istt_change_tm;     //I状态变化开始时间
	  uint64_t  Istt_change_stabi_tm;    //I稳定状态变化时间
	  uint64_t  Istt_change_normal_tm;   //I正常状态的时间;
};

// 蜂鸣器相关
typedef struct{
	  uint8_t   beep_step; 
    uint8_t   beep_times; 
    uint16_t  beep_Tm; 
    uint16_t  beep_idle_Tm; 
    uint64_t  beep_start_tm; 	
}beep_param;


//////////////////////////////////// 485电表相关 /////////////////////////////////////////
#if meter485_ON > 0 
#if PowerSupplyPhase == 1
enum meter485_idx{
	  meter485_idx_Sect1 = 1,
	  meter485_idx_Sect2,
	  meter485_idx_total    // 3
};
#endif

typedef union{
	  uint8_t  dataArray[4];
	  float   dataFloat; 
} meter485_Data;

typedef union{
	  uint8_t    dataArray[2];
	  uint16_t   dataInt; 
} CRC16_Data;

#endif
//////////////////////////////////// 串口相关 /////////////////////////////////////////
////////////////////  串口参数  /////////////////
#if using_uart1 > 0 || using_uart2 > 0 || using_uart3 > 0 || using_uart4 > 0 || using_uart5 > 0
#define   txBuf_size                128
#define   rxBuf_size                128
#endif
#if using_uart1 > 0
#if BleWifi_Uart_Using == BleWifi_Uart1
  #define   uart1_header_H            0x41   //41
	#define   uart1_header_L            0x54   //54
	#define   txBuf1_size               128     // 写数据缓存大小
	#define   rxBuf1_size               128     // 读数据缓存大小
	#define   len1_bit                  2       // 数据长度的字节位置，开头位置=0
	#define   len1_bit_num              0       // 数据长度的字节数;2=2个字节表示长度数据; len1_bit_num = [1,2] 
	#define   check1_out_Len            2       // 长度之外的校验位。0 表示校验位已经包含在长度范围内。
	#define   uart1_End_H               0x4F    //O // uart1_End_H 和 len1_bit 宏最好二选一。len1_bit_num = 0;结束模式靠结束标志位确定,否则2个都选。  
	#define   uart1_End_L               0x4B    //K // uart1_End_H + uart1_End_L = 结束标志位;
  //第二种形式的接收方式
	#define   uart1_header2_H           0x05
	#define   uart1_header2_L           0x01
	#define   len1_bit_2                2       // 数据长度的字节位置，开头位置=0;
	#define   len1_bit_num2             2       // 数据长度的字节数;2=2个字节表示长度数据; 
	#define   check1_out_Len2           -2      // 长度之外的校验位。0 表示校验位已经包含在长度范围内。-2:长度还包含包头。
  #define   uart1_End2_H              0x0A    // uart1_End_H 和 len5_bit 宏最好二选一。  
	#define   uart1_End2_L              0x02 	
#else
	#define   uart1_header_H            0xA5
	#define   uart1_header_L            0x5A
	#define   txBuf1_size               32     // 写数据缓存大小
	#define   rxBuf1_size               32     // 读数据缓存大小
	#define   len1_bit                  2       // 数据长度的字节位置，开头位置=0
	#define   len1_bit_num              1       // 数据长度的字节数;2=2个字节表示长度数据; len1_bit_num = [1,2] 
	#define   check1_out_Len            2       // 长度之外的校验位。0 表示校验位已经包含在长度范围内。
	#define   uart1_End_H               0x5d    // uart1_End_H 和 len1_bit 宏最好二选一。len1_bit_num = 0;结束模式靠结束标志位确定,否则2个都选。  
	#define   uart1_End_L               0x5d    // uart1_End_H + uart1_End_L = 结束标志位;
#endif
#endif
#if using_uart2 > 0
#ifdef meter_Addr
	#define   uart2_header_H            meter_Addr
	#define   uart2_header_L            meter485_cmd_FunCode_rd
  #define   txBuf2_size               meter485_buffLen + 8 
  #define   rxBuf2_size               meter485_buffLen + 8
	#define   len2_bit                  2       // 数据长度的字节位置，开头位置=uart2_header_H=0
  #define   len2_bit_num              1       // 数据长度的字节数;2=2个字节表示长度数据;
	#define   check2_out_Len            2       // 长度之外的校验位。0 表示校验位已经包含在长度范围内。
#else
	#define   uart2_header_H            0x5B
	#define   uart2_header_L            0x5B
	#define   txBuf2_size               32  
  #define   rxBuf2_size               32
	#define   len2_bit                  2       // 数据长度的字节位置，开头位置=0
  #define   len2_bit_num              2       // 数据长度的字节数;2=2个字节表示长度数据;
	#define   check2_out_Len            2       // 长度之外的校验位。0 表示校验位已经包含在长度范围内。
#endif
#define   uart2_End_H               0x5d      // uart1_End_H 和 len1_bit 宏最好二选一。  
#define   uart2_End_L               0x5d
#endif
#if using_uart3 > 0
#define   uart3_header_H            0x5B    // '[['
#define   uart3_header_L            0x5B
#define   txBuf3_size               32    
#define   rxBuf3_size               32
#define   len3_bit                  2       // 数据长度的字节位置，开头位置=0
#define   len3_bit_num              0       // 数据长度的字节数;2=2个字节表示长度数据;
#define   check3_out_Len            2       // 长度之外的校验位。0 表示校验位已经包含在长度范围内。
#define   uart3_End_H               0x5d    // uart1_End_H 和 len3_bit 宏最好二选一。len3_bit_num = 0;结束模式靠结束标志位确定。  
#define   uart3_End_L               0x5d    // ']]'
#endif
#if using_uart4 > 0
#define   uart4_header_H            0xEF     // Finger_Header_H
#define   uart4_header_L            0x01     // Finger_Header_L
#define   txBuf4_size               32    
#define   rxBuf4_size               32
#define   len4_bit                  7         // 数据长度的字节位置，开头位置=0
#define   len4_bit_num              2         // 数据长度的字节数;2=2个字节表示长度数据; 
#define   check4_out_Len            2       // 长度之外的校验位。0 表示校验位已经包含在长度范围内。
#define   uart4_End_H               0x5d      // uart1_End_H 和 len4_bit 宏最好二选一。  
#define   uart4_End_L               0x5d
#endif
#if using_uart5 > 0
#if BleWifi_Uart_Using == BleWifi_Uart5
  #define   uart5_header_H            0x41
	#define   uart5_header_L            0x54
	#define   txBuf5_size               240     
	#define   rxBuf5_size               240
	#define   len5_bit                  2       // 数据长度的字节位置，开头位置=0;
	#define   len5_bit_num              0       // 数据长度的字节数;2=2个字节表示长度数据; 
	#define   check5_out_Len            0       // 长度之外的校验位。0 表示校验位已经包含在长度范围内。 
	#define   uart5_End_H               0x4F    // uart1_End_H 和 len5_bit 宏最好二选一。  
	#define   uart5_End_L               0x4B
	//第二种形式的接收方式
	#define   uart5_header2_H           0x05
	#define   uart5_header2_L           0x01
	#define   len5_bit_2                2       // 数据长度的字节位置，开头位置=0;
	#define   len5_bit_num2             2       // 数据长度的字节数;2=2个字节表示长度数据; 
	#define   check5_out_Len2           -2      // 长度之外的校验位。0 表示校验位已经包含在长度范围内。-2:长度还包含包头。
  #define   uart5_End2_H              0x0A    // uart1_End_H 和 len5_bit 宏最好二选一。  
	#define   uart5_End2_L              0x02 	
#else
	#define   uart5_header_H            0x5B
	#define   uart5_header_L            0x5B
	#define   txBuf5_size               32     
	#define   rxBuf5_size               32
	#define   len5_bit                  2       // 数据长度的字节位置，开头位置=0;
	#define   len5_bit_num              2       // 数据长度的字节数;2=2个字节表示长度数据; 
	#define   check5_out_Len            2       // 长度之外的校验位。0 表示校验位已经包含在长度范围内。 
	#define   uart5_End_H               0x5d    // uart1_End_H 和 len5_bit 宏最好二选一。  
	#define   uart5_End_L               0x5d
#endif
#endif

////////////////////  数据结构  /////////////////
typedef struct{
	  uint8_t    recv_ctrl;      // 控制串口接收数据; ==1 就开始接收数据;
	  #if BleWifi_type == BleWifi_Ai_WB2		  
		int8_t  end_type;
		#endif
	  uint16_t   uart_idx;       // 串口数据下标
    uint16_t   datLen;         // 默认rxBuf1_size
    uint8_t    uartRxDatas[rxBuf_size];  
    uint8_t    uartTxDatas[txBuf_size]; 
} UART_Control;

//// 传输数据尺寸
//#define     OUTPUT_DATA_SIZE      36
//// 充电桩对外发送数据结构
//typedef union{	  
//	  __IO uint8_t  tansDatas[OUTPUT_DATA_SIZE];
//	  __IO struct{
//			  uint8_t   dataHeader_H;     //数据头：2字节;
//        uint8_t   dataHeader_L;			
//			  uint8_t   package_id;       //包id;
//			  uint8_t   package_end_id;   //结束包id;
//			  uint8_t   dataSize;         //数据大小，单位=字节；
//			  uint8_t   data_chg_state;   //充电状态：空闲，插枪，充电中，结束充电，等状态。
//			  uint16_t  data_reted;       //额定充电电流：两字节;  单位 = 0.1 A
//			  uint16_t  data_TMPR;        //温度数据：两字节;  单位=0.1  ℃
//			  uint16_t  data_voltage;     //电压数据：两字节;  单位=0.1  V
//			  uint16_t  data_current;     //电流数据：两字节;  单位=0.1  A
//			  uint16_t  data_power;       //功率数据：两字节;  单位=0.01 KW
//			  uint16_t  data_QOE;         //电量数据：两字节;  单位=0.1  KWh			  
//			  #if PowerSupplyPhase == 3
//			  uint16_t  data_voltage_B;     //B相电压数据：两字节;  单位=0.1  V
//			  uint16_t  data_current_B;     //B相电流数据：两字节;  单位=0.1  A		
//        uint16_t  data_voltage_C;     //C相电压数据：两字节;  单位=0.1  V
//			  uint16_t  data_current_C;     //C相电流数据：两字节;  单位=0.1  A				
//			  #endif	
//			  uint8_t   Chgr_Name[8];       //充电桩编号：最大8位。最后几位若是=0x32，则不显示。	
//			  uint16_t  checkSum; 	        //校验和：package_id到checkSum之和；包含package_id，不包含checkSum。
//    }tansDataObj;	
//} OUTPUT_DATA;


//////////////////////////////////// 4.3寸屏显示 //////////////////////////////////
typedef struct{
	  uint8_t   lcd_show_step;      // 显示步骤：第一步显示什么，第二步显示什么，统一管理。
	  uint8_t   lcd_show_popup;     // 显示弹窗： 比如正常流程中，弹出设置对话框等。	  
    uint8_t   lcd_page_id;        // 显示页面的id
	  uint8_t   lcd_luminance;      // 记录屏幕设置的亮度
    // 显示的其他参数
    int8_t    countdownStart[1];  // 倒计时变量；默认数值{9}
    int8_t    timer_recoder[3];   // 计时变量：时，分，秒数据
	  uint8_t   fualtIdOffst;       // 错误页的偏移量,根据faultCode进行偏移。
    uint8_t   RTC_data[7];        // RTC时间BCD码;默认数值{0x25, 0x02, 0x11, 0x02, 0x16, 0x24, 0x19}; 
	  // 弹窗显示时间：单位：1秒
	  uint8_t   lcd_popup_time;
	  // 错误详情页和错误页切换时间记录
	  uint64_t  lcd_showErr_tm;
	  #if SEND_RTC_EN > 0
	  // 页面切换的起始时间：
	  uint64_t  lcd_pageStart_tm;
	  #endif
} LCD_Param;

// 温度显示
#if tmpr_nums > 1
	#define  TMP_SHOW           TMP_Ext1
#else 
	#define  TMP_SHOW           TMP_BoardIn
#endif

// 电流计量显示
#if meter485_ON > 0
	#define    LCD4P3_SHOW_U_RMS             UI_Data_Show->U_RMS
  #define    LCD4P3_SHOW_I_RMS             UI_Data_Show->I_RMS
  #define    LCD4P3_SHOW_QOE               UI_Data_Show->QOE
  #define    LCD4P3_SHOW_QOE_ChgS          UI_Data_Show->QOE_ChgStart 
  #define    LCD4P3_SHOW_Papt              UI_Data_Show->Papt
  #if PowerSupplyPhase == 3
		#define    LCD4P3_SHOW_UB_RMS          UI_Data_Show->UB_RMS
		#define    LCD4P3_SHOW_IB_RMS          UI_Data_Show->IB_RMS
		#define    LCD4P3_SHOW_UC_RMS          UI_Data_Show->UC_RMS
		#define    LCD4P3_SHOW_IC_RMS          UI_Data_Show->IC_RMS		
  #endif
#else
	#define    LCD4P3_SHOW_U_RMS             UI_Data.U_RMS
  #define    LCD4P3_SHOW_I_RMS             UI_Data.I_RMS                               
  #define    LCD4P3_SHOW_QOE               UI_Data.QOE
  #define    LCD4P3_SHOW_QOE_ChgS          UI_Data.QOE_ChgStart
  #define    LCD4P3_SHOW_Papt              UI_Data.Papt
	#if PowerSupplyPhase == 3
		#define    LCD4P3_SHOW_UB_RMS          UI_Data.UB_RMS
		#define    LCD4P3_SHOW_IB_RMS          UI_Data.IB_RMS
		#define    LCD4P3_SHOW_UC_RMS          UI_Data.UC_RMS
		#define    LCD4P3_SHOW_IC_RMS          UI_Data.IC_RMS		
  #endif
#endif

// 显示步：不同显示步，显示不同页面。或可显示多个页面。
enum lcd_step{
	  lcd_step_self_check = 1,   // 开机自检[开机启动，3秒] 
	  #if BLE_WIFY_EN > 0
	  lcd_step_RTC_set,          // 时间校准[   ]
	  #endif
    lcd_step_wait_plug,        // 等待插枪[12V时候] 
	  #if card_type_sel > 0
	  lcd_step_card_startup,     // 等待刷卡[   ]
	  #endif
	  #if Non_Plug_And_Charge > 0
	  lcd_step_bottn_startup,	  
	  lcd_step_app_startup,
	  #endif 
	  #if RESV_CHG_ON > 0
	  lcd_step_app_reservation,
	  #endif
	  lcd_step_safe_check,       // 安全检测[插枪后,程序自检,12v转9V,到自检完成]	  
	  lcd_step_wait_chg,         // 等待充电[已经转至6V中,等待继电器闭合]	  
	  lcd_step_chging,           // 正在充电[6V中，继电器闭合]
	  lcd_step_EV_pause,         // 没充满停止充电,车发出[6V转9V]
	  lcd_step_chgr_pause,       // 没充满停止充电,充电桩发出[6V转9V]
	  lcd_step_chg_full,         // 充满停止充电[6V转9V,电流很小了,涓流]
	  lcd_step_plug_out,         // 等待拔枪
	  lcd_step_chg_error,        // 错误故障提示
    lcd_step_sum,              // 汇总:总数量 = lcd_step_sum - 1
};

// LCD的弹出框id：弹出框模块，不同模块对应多个或一个页面
enum lcd_popup{
	  lcd_popup_reservation_set = 1,   // 设置预约充电;
	  lcd_popup_delay_stop,            // 外部触发充电后，外部触发结束充电时的延时结束充电，显示的提示页面	
    lcd_popup_sum,                   // 汇总：总数量 = lcd_popup_sum - 1
};


////////////////////////////////////// 刷卡 /////////////////////////////////////////
#if card_type_sel > 0
// 卡信息字节数
#define cardInfoSize                6
#define card_step_max               88
// 刷卡时间间隔
#define cardDetectFreq              100    // 100 = 100 * 10ms = 1秒

// 卡密码:A密码+B密码
#define cardPwd                     {0x11,0x11,0x22,0x22,0x33,0x33}
#define cardPwdB                    {0x22,0x11,0x22,0x22,0x33,0x33}
// 密码控制模式
#define PWDContrlMode               {0xFF,0x0F,0x00,0x69}
// 充电卡的金额标志加密密码
#define CASH_TIP                    {0x73,0x78,0x6b,0x6a}
// 充电卡的金额加密密码
#define CASH_PWD                    {0x58,0xa6,0x6b,0x15,0xed,0x32}
// 充电卡的金额最大值：> 此值的都是非法金额数据
#define Cash_Max                     999

////// 卡数据类型标志 /////////
// 充电设置卡类型标志字节
#define cardDataTypeChgSet0          0x06   
#define cardDataTypeChgSet1          0xF5                                 
#define cardDataTypeChgSet2          0x06                                 
#define cardDataTypeChgSet3          0xF8                                 
// 密码设置卡类型标志字节
#define cardDataTypePWDSet0          0x08   
#define cardDataTypePWDSet1          0xE5                                 
#define cardDataTypePWDSet2          0xA6                                 
#define cardDataTypePWDSet3          0xC8 
// 免费卡类型标志字节
#define cardDataTypeFree0            0x07
#define cardDataTypeFree1            0xE2                                 
#define cardDataTypeFree2            0x3F                                 
#define cardDataTypeFree3            0x68 
// 线下充电卡含金额的标志字节
#define cardDataTypeCash0            0x03  
#define cardDataTypeCash1            0xFC                                 
#define cardDataTypeCash2            0x03                                 
#define cardDataTypeCash3            0xFC   


// 卡类型标志
enum card_type_flag{
	  card_state_charge = 1,           // 已经刷了密码的充电卡
	  card_state_new,                  // 新卡
	  card_state_chgSet,               // 设置卡
	  card_state_pwdSet,               // 设置卡
	  card_state_free,                 // 免费卡
	  card_state_cash,                 // 充电金额卡
};

// 卡操作类型
enum cardOper_type_flag{
	  card_oper_read = 1,              // 读卡
	  card_oper_write,                 // 写数据进入卡
	  card_oper_setPwd,                // 设置密码
};

// 卡内金额数据：
union cardCashDataFormat{
	  uint8_t  arrData[4];
	  uint32_t intData;
};

// 卡内数据，设置数据
union cardSetDataFormat{
	  uint8_t  charArrData[8];
	  uint16_t shortArrData[4];	  
};

#endif 

// 数据格式转换
union dataFormatTrans{
	  float fltData; 
	  uint32_t uint32Data; 
	  int32_t int32Data; 
	  uint16_t int16DataArr[2]; 
	  uint8_t int8DataArr[4]; 
};



//////////////////////////////////// 指纹识别 /////////////////////////////////////////
#if finger_sensor_type > 0
	#define fingerDetectFreq              150    // 150 = 150 * 10ms = 1.5秒
	
	// 注册指纹控制参数:参数位说明：
	// bit0：采图背光灯控制位， 0-LED 长亮， 1-LED 获取图像成功后灭；
	// bit1： 保留；  bit2： 注册过程中，要求模组返回关键步骤， 0-要求返回， 1-不要求返回
	// bit3：是否允许覆盖ID 号， 0-不允许， 1-允许；
	// bit4：允许指纹重复注册控制位， 0-允许， 1-不允许；
	// bit5：注册时，多次指纹采集过程中，是否要求手指离开才能进入下一次指纹图像采集， 0-要求离开； 1-不要求离开；
	// bit6~bit15：预留。
	#define finger_reg_param_H            0x00
	#define finger_reg_param_L            0x00
	// 自动验证参数：
	#define finger_AutoIdentify_H         0x00
	#define finger_AutoIdentify_L         0x00
	// 一个ID，录入指纹的次数
	#define finger_reg_times              3
  
	//////////////////////  数据结构 ///////////////////////
	// 检验和数据
	union Finger2ByteData{
			uint8_t  charArrData[2];
			uint16_t shortData;	  
	};
	
  // 指纹操作控制参数
	typedef struct{
		  uint8_t finger_step;   // 指纹识别步骤
      uint8_t finger_busy;   // 指纹识别忙
		  uint8_t fingerCMD;                   // 指纹指令        
      uint8_t finger_errCode;              // 指纹错误id
		  // 指纹外部中断：指纹被激活的变量
		  #if finger_sensor_type == Finger_HLK_ZW101_EINT
			uint8_t finger_event_occ;
			#endif
		  // 录入指纹的id
      union Finger2ByteData  finger_id;           // 录入指纹的id
      union Finger2ByteData  finger_checkSum;     // 校验和
      union Finger2ByteData  finger_package_len;  // 指纹包数据长度
      		  
	}finger_control;
	
	// 指纹信息参数
	typedef struct{		  
      union Finger2ByteData  finger_search_id;       // 搜索指纹的id      
      union Finger2ByteData finger_register_times;   // 指纹寄存器时间
      union Finger2ByteData finger_template_size;    // 指纹模板大小
      union Finger2ByteData finger_lib_size;         // 指纹库大小
      union Finger2ByteData finger_package_size;     // 指纹数据包大小
      union Finger2ByteData finger_score_level;      // 指纹分数等级
      union Finger2ByteData finger_Baud_Rate;        // 指纹波特率
	
	}finger_info;
	
#endif
	
//////////////////////////////////// 预约充电相关 /////////////////////////////////////////////
#if	RESV_CHG_ON  > 0 || PlugCharge_And_Resv
#define  resv_numbs              	4                 //预约次数; 开启充电和结束充电算一次预约。开启和结束充电预约，彼此轮换。
#define  resv_ticks               6000              //计时间隔，6000=6000*10ms=60秒=1分钟。
#define	 resv_timeSeg             5997              //预约执行的时间片
// 重复预约
typedef union{	  
	  __IO uint8_t week;
	  __IO struct{
			  __IO uint8_t week_1           : 1;   // 周一
			  __IO uint8_t week_2           : 1;   // 周二
        __IO uint8_t week_3           : 1;   // 周三
        __IO uint8_t week_4           : 1;   // 周四
        __IO uint8_t week_5           : 1;   // 周五
        __IO uint8_t week_6           : 1;   // 周六			  
			  __IO uint8_t week_7           : 1;   // 周日
			  __IO uint8_t week_err         : 1;
    }week_id;	
} ResvWeek;	

//数据结构：
typedef struct{
	  uint8_t   resv_time_idx;              //预约时间组下标
	  uint8_t   resv_week_idx;              //周指针
	  ResvWeek  resv_week;                  //重复预约设置	     
    uint16_t  resv_time[resv_numbs];      //预约时间组；idx=0，开启充电时间点；idx = 1，充电结束时间点，若是没有或无效，则一直充电直到充满。单位=分钟。
    uint64_t  resv_start_point;           //预约开始的时间。时间戳类型。 单位=ms。	
}ResvCtrl; // 大小=24
#define ResvCtrl_size              24
#endif	
	
/////////////////////////////// 普通参数永久保存相关 ////////////////////////////////////
// 保存参数数据的类型；
union flashDataUnion{
	  uint8_t  charData[4];
	  float fltData;
	  uint32_t intData;
};

// 参数所在的idx：
enum Flash_WD_idx{
	  #if Rated_Save_EN
    FWD_IRated_idx,                // 额定充电电流保存；0
	  #endif
	  FWD_SysStart_idx,              // 系统启动时间数据保存；1
	  FWD_QOE_idx,                   // 电能保存保存；2
	  Chgr_Id_Int_H,                 // 充电桩id的高4位
	  Chgr_Id_Int_L,                 // 充电桩id的低4位
	  
	  #if LOG_ON > 0
	  FWD_LogsSize_idx,              // 日志总数保存；3
	  #endif
	
	  #if CURVE_ON > 0
	  FWD_CurvSize_idx,               // 功率曲线节点总数保存；4  
	  #endif
	
	  #if Nor_Flash > 0 && LOG_ON > 0 
	  FWD_LogSavePageId_idx,         // 日志保存的页数
	  #endif
	
	  #if Nor_Flash > 0 && CURVE_ON > 0
	  FWD_CurvSavePageId_idx,
	  #endif
	
    #if RESV_CHG_ON  > 0 || PlugCharge_And_Resv
		resv_sp_idxH,          // 高位
		resv_sp_idxL,
		resv_t1_idx,           // 最多2组预约时间
		resv_t2_idx,
		resv_wkEn_idx,         // 重复预约		
		#endif
				
    Write_Data_size,
};

///////////////////////////////////// BleWifi相关 /////////////////////////////////////////
#if BLE_WIFY_EN > 0
#define bw_mac_size              6   //蓝牙Mac地址的字节数
#define  bw_name_size            32  //wifi名长度;
#if BleWifi_Uart_Using == BleWifi_Uart1
#define bw_ctrl_uart     uart1Ctrl
#elif BleWifi_Uart_Using == BleWifi_Uart5
#define bw_ctrl_uart     uart5Ctrl 
#endif
typedef struct{
	  int8_t   bw_reset_step;
	  int8_t   bw_has_device;
    uint8_t  bw_query_id;
	  uint8_t  bw_bleSet_id;
	  uint8_t  bw_wifiSet_id;	  
    int8_t   bw_bleMode;
    int8_t   bw_wifiMode;	 
    int8_t   bw_wifiSSI;	
    int8_t   bw_ble_conn;
    int8_t   bw_wifi_conn;	
	  uint8_t  bw_mac[bw_mac_size];
	  uint8_t  bw_sta_name[bw_name_size];
	  uint8_t  bw_sta_pwd[bw_name_size];
} BleWiFiData;

//传入数据库的数据
#define chgrSnapshotLen               38     // 数据快照:结构体字节数
#define chgrSnapshotSM4Len            48     // (chgrSnapshotLen / 16 + (chgrSnapshotLen % 16 > 0 ? 1 : 0)) * 16 = 48
#define chgrSnapshotBase64Len         65     // 4 * ((chgrSnapshotLen + 2) / 3) = 4 * ((36 + 2) / 3)

typedef struct{
		uint8_t   CSS_CP_id;
		uint8_t   CSS_relay_status;
		uint16_t  CSS_PWM_Duty;
		uint16_t  CSS_reted;
		uint16_t  CSS_Tmpr_Board;
		uint16_t  CSS_Tmpr_chgr;
		uint16_t  CSS_Tmpr_plugr;
		uint16_t  CSS_U;
		uint16_t  CSS_I;
		uint16_t  CSS_Powr;
		uint16_t  CSS_QOE;
		uint16_t  CSS_UB;
		uint16_t  CSS_IB;
		uint16_t  CSS_UC;
		uint16_t  CSS_IC;	
	  uint16_t  CSS_FaultCode;
    uint8_t   CSS_devName[8];	
}CSS_data;	

typedef union{	  
	  uint8_t arr[chgrSnapshotLen];
	  CSS_data  snapshot_data;
} ChgrSnapshot;	

#endif


//////////////////////////////////// 日志数据相关 /////////////////////////////////////////
#if LOG_ON > 0
// 日志等级
enum log_level{
    Log_Debug = 1,        //最详细的日志级别，用于开发和调试阶段，记录了软件的调试信息。
    Log_Info,             //记录了系统运行的常规信息，如充电桩启动、停止等。
    Log_Warning,          //警告级别，记录了可能出现问题的情况，但不一定影响系统运行。
    Log_Error,            //系统出现错误时的记录，会影响系统部分功能。
    Log_Fatal             //记录了严重的错误，系统可能无法继续运行
};

// 日志事件
enum log_Event{
    logFlt_cp_fault = 1,           //1
    logFlt_low_voltage,            //2
		logFlt_over_voltage,           //3
		logFlt_PE_protection,          //4
		logFlt_over_current,           //5
		logFlt_short_circuit,          //6
		logFlt_leakage,                //7
		logFlt_over_tempr,             //8
		logFlt_Istate_adjust,          //9
		logFlt_carD1_bad,              //10    //车端二极管损坏
		logFlt_relay_adhesion,         //11    // 继电器粘连
		logFlt_tmpr_boardIn_e,         //12    //pcb板内传感器坏了;
		logFlt_I_data_e,               //13    //电流值有问题;
		logFlt_U_data_e,               //14    //电压值有问题;
		logFlt_tmpr_adjust_err,        //15    //温度调整
		logFlt_flash_err,              //16    //flash错误
	  logEvt_StartUP,                //17    //系统启动
	  logEvt_ShutDown,               //18    //系统关闭
	  logEvt_ChargeStart,            //19    //开启充电
	  logEvt_ChargeStop,             //20    //关闭充电
	  
};

// 日志项数据结构： 结构体大小：1 + 1 + 4 + 4 = 14; 3 * 4 = 12B;
struct log_Item{
    uint8_t        logGrade;       // 日志等级	                1B
    uint8_t        logEvent;       // 日志事件-发生了什么事情;  1B
	  uint32_t       logEvtData;     // 日志事件数据；默认 = 0。  4B
	  uint32_t       occTime;        // 日志项发生的RTC时间戳;    4B; 单位 = 秒；   
};

// 保存日志数据的类型
#define logDataUnionIntLen      3
#define logDataUnionByteLen     12
union logDataUnion{
		struct log_Item logData;                    // 12B		
	  #if Nor_Flash > 0
	  uint8_t byteData[logDataUnionByteLen];      // 字节数组
	  #else
	  uint32_t intData[logDataUnionIntLen];       // 4*3=12B   
	  #endif
};

// 日志数组的大小：最好整一个扇区的量 = 4KB = 4096 / 16 = 256; NorFlash擦除，是按照扇区进行的。
// 芯片内部flash按页进行，因此，可以保存2页。
#if defined APM32F10X_HD || defined APM32E10X_HD || Nor_Flash > 0	
	#define Logs_Data_size        341   // 4KB能装的日志数据数组大小。4096 / logDataUnionByteLen = 341 
#else	
	#define Logs_Data_size        170   // 2KB  
#endif 

// flash日志保存的总扇区数:
#if Nor_Flash > 0
	#if CURVE_ON > 0 
	#define Total_LogData_Sects      256   // 功率曲线和日志各占一半内存;
	#else
	#define Total_LogData_Sects      512 
	#endif
#endif // #if Nor_Flash > 0

#endif //#if LOG_ON > 0 

///////////////////////////////// 功率曲线相关 /////////////////////////////////////////
#if CURVE_ON  > 0
// 数据曲线数据结构：2 + 2 + 4 + [2 + 2 + 4 + 4 +] 8 = 12[24]
struct Curv_Item{    	
	  uint16_t  chgI;         // 充电电流
	  uint16_t  chgTmpr;      // 充电桩内温度
	  uint32_t  chgPwr;       // 充电功率
	  #if UI_Meter_Method == Meter_GuageIC_RN8302B  // 3相桩
	  uint16_t  chgBI;         // B充电电流
	  uint16_t  chgCI;         // C充电电流
	  uint32_t  chgBPwr;       // B充电功率
	  uint32_t  chgCPwr;       // C充电功率
	  #endif
	  uint32_t  occTime;      // 数据点的时间; 8B: 单位 = 秒；
};

// 曲线数据的内存分配
#if UI_Meter_Method == Meter_GuageIC_RN8302B  // 3相桩
	#define curvDataUnionIntLen      6
	#define curvDataUnionByteLen     24
#else
	#define curvDataUnionIntLen      3
	#define curvDataUnionByteLen     12
#endif
union curvDataUnion{
		struct Curv_Item curvData;                     // 12B 或 24B		   
	  #if Nor_Flash > 0
	  uint8_t byteData[curvDataUnionByteLen];        // 字节数组; NorFlash保存格式;1字节单位保存
	  #else
	  uint32_t intData[curvDataUnionIntLen];         // 4字节单位保存。
	  #endif
};

// 保存曲线数据大小：NorFlash时，最好整一个扇区的量 = 4KB = 4096 / 24 = 170; NorFlash擦除，是按照扇区进行的。
// 芯片内部flash按页进行，因此，可以保存2页 = 4KB。
#if UI_Meter_Method == Meter_GuageIC_RN8302B  // 3相桩
	#if defined APM32F10X_HD || defined APM32E10X_HD || Nor_Flash > 0	
		#define Curv_Data_size        170   // 4KB / 24B = 170 
	#else	
		#define Curv_Data_size        85    // 2KB / 24B = 85 
	#endif 
#else  // 单相桩
  #if defined APM32F10X_HD || defined APM32E10X_HD || Nor_Flash > 0	
		#define Curv_Data_size        256   // 4KB / 12B = 341 
	#else	
		#define Curv_Data_size        170   // 2KB / 12B = 170
	#endif 
#endif

// flash日志保存的总扇区数:
#if Nor_Flash > 0
	#if LOG_ON > 0 
	#define Total_CurvData_Sects      256   // 功率曲线和日志各占一半内存;
	#else
	#define Total_CurvData_Sects      512 
	#endif
#endif // #if Nor_Flash > 0


#endif // #if CURVE_ON  > 0

//////////////////////////////////// 全局变量 /////////////////////////////////////////
extern uint8_t  Chgr_Name[8];
#if Key1 > 0 
extern key_param key1_param;
extern int8_t key1_level;
#endif
extern struct Leakage_Ctrl leakData;

extern uint64_t led_startUp_TmRecode;

extern uint8_t   iLed;
extern uint16_t  ledBlinkIntv[2];
extern uint8_t   ledBlinkTms;
extern uint8_t   ledBlinkDuty;
extern uint64_t  ledBlink_TmRecode;

extern uint8_t   ledUsingStyle;
//extern uint8_t   PE_occ_tm_pre; 
//extern uint8_t   PE_occ_times;
extern uint64_t  PE_occ_recode;
extern uint8_t   PE_state;
#if PE_method == PE_method_ADC
extern uint16_t  PE_VoltRest;
#endif
extern uint8_t   PE_EN;

#if CarD1_Protect > 0
extern struct CarD1_param CarD1Param;
#endif

extern uint16_t  ADC_read_times;
extern ADC_BUF  ADC_Buffer;
//extern ADC_BUF  ADC_Buffer_OK;
//#if ADC_num > 1
//extern uint32_t  ADC_Value[ADC_Total];
//extern uint16_t  ADC3_Value[ADC3_Total];
//#else
//extern uint16_t  ADC_Value[ADC_Total];
//#endif
extern uint16_t  UI_Value[UI_Datas_Len][2];
//extern uint64_t  UI_Value_time[UI_Datas_Len];
extern uint8_t   U_idx;
extern uint8_t   I_idx;

#if UI_Meter_Method == Meter_GuageIC_RN8302B || UI_Meter_Method == Meter_GuageIC_RN8209 
extern  uint32_t readDataTmp;			
#endif

extern  UI_PARAM  uiValues;
#if meter485_ON > 0
extern UI_PARAM  uiValues2;
#endif
extern UI_Meter UI_Data;

#if CP_Mode == CP_Mode_sta
extern uint16_t  CP_Datas[CP_Datas_Len];
#endif

extern uint64_t  chg_start_tm;
extern uint64_t  Relay_Chg_tm;
extern uint8_t   Rly_status;
extern uint8_t   chg_stage;
extern uint16_t  relay_duty;
#if Non_Plug_And_Charge > 0 || PlugCharge_And_Resv
extern Chg_External_Reason startChgExternalReason;
extern uint16_t  externalIntv;
#endif

#if Has_RlyPin_Maintaining > 0
extern uint8_t Rly_startup_status;
#endif

extern uint16_t  TMP_BoardIn_R;
extern uint16_t  TMP_Ext1_R;
extern uint16_t  TMP_Ext2_R;

extern float  TMP_BoardIn;
extern float  TMP_IC;
extern float  TMP_Ext1;
extern float  TMP_Ext2;

extern uint16_t TMP_show_lb;
extern uint16_t TMP_show_int;

#if RlyPin_Ctrl_PWM_EN > 0 && (defined SQDri_WS018B || defined SQDri_WS018)
extern uint8_t  adc_adjust;
#endif

extern struct  U_Ctrl   U_CtrData;

extern struct  I_Ctrl_Flag I_State_Flag;

extern struct  I_Ctrl      I_CtrData;

extern float   ISrt_value;

extern struct  Tmpr_Ctrl  tmpr_CtrData;

extern struct PWM_Param PWM_Data;

extern struct CP cp_data;
#if CP_CarD1_Trigger_Mode == CP_CarD1_Trigger_TMRDelay	
extern uint8_t CP_CarD1_TmrBusy;
#endif
extern _Bool CP_idChg;
extern _Bool CP_9_12_Chg;

#if CC_Detect_type > 0
extern uint8_t PlugIn_CC;
#endif


#if RlyAdh_Detect_type > 0  
extern uint8_t rly_adhsn;  
extern uint64_t rlyAdh_ToZero_tm;  
#endif

extern uint8_t I_rated_idx; 
#if I_rated_count >  1      
extern uint32_t I_rated_List[I_rated_count];  
#if meter485_ON > 0
extern uint32_t I_rated_List2[I_rated_count];
#endif
extern float I_rated_Listf[I_rated_count];   
extern uint16_t DUTY_CYCLE_List[I_rated_count];    
#endif

extern uint8_t  main_update;	
extern uint8_t  chg_selfCheck_complt; 

extern uint8_t chgForbid; 

#if proactive_chgStop_EN > 0 || PlugCharge_And_Resv
extern int16_t stopChargeTmr; 
#endif

extern uint16_t system_startup_times; 

extern uint64_t system_time;
extern uint64_t plugin_time;
extern uint16_t task_tms;

extern uint16_t mTask_SW; 

extern uint32_t mTask_Fault;
extern uint32_t mTask_Fault_using;
#ifndef UsingFreeRTOS
extern uint64_t  fault_recover_tm;
#endif
extern uint32_t  fault_recvr_intv;
extern uint8_t   faultRecv_counts;
extern uint8_t   faultRecv_Limit_tms;

extern uint8_t  faultOcc_IOvrRecv_counts;
extern uint8_t  faultOcc_TmprAdj_counts;
extern uint8_t  faultCode;
extern uint8_t  faultCodeUsingErr;
extern uint8_t  faultCodeUsingLed;

extern uint8_t  fault_update;
#if CC_Detect_type == 0
extern uint8_t  plug_out_times;
extern uint8_t  plug_in_times;
#endif
extern uint8_t  system_started;

extern uint16_t   Led_bits;
extern uint16_t   LedOff_bits;

extern uint16_t  ledBlinkIntv[2];
#ifdef Using_LedCtrl_74HC595
extern uint8_t   Led595_bits;
extern uint8_t   LedOff595_bits;
#endif

#if Using_UART_LCD == LCD_0P42_IIC
// OLed 重置步
extern uint8_t oled_reset_step;
extern uint16_t  oled_reset_step_tm;
extern uint16_t  oled_reset_step_delay;

extern uint8_t dataId;
extern uint8_t OledResetTm;
// OLed 设备地址：
extern char iicBuffer[iicBufferSize];
extern uint64_t key_down_recode;
#elif Using_UART_LCD == LCD_4P3_UART
extern LCD_Param  lcdParam;
#if meter485_ON > 0
extern UI_Meter *UI_Data_Show; 
#endif
#endif

#if volt_zero_crossing > 0
extern uint8_t rly_on_mark;
#endif

#if beep_type > 0
extern beep_param beep;
#endif

#if card_type_sel > 0
extern int8_t    RC522_ready;
extern int8_t    card_step;
extern uint8_t   card_type;
extern uint8_t   card_oper_type;
extern uint8_t   cardOper_blockId;
extern uint8_t   g_ucTempbuf[20];
extern uint8_t   m1CardInfo[cardInfoSize];
extern union     cardCashDataFormat cardCashData;
extern union     cardSetDataFormat cardSetsData;
extern int8_t    isCardBusy;
extern uint8_t   card_pwd[6];

#endif

#if PinPick_RatedI > 0
extern uint8_t PinPick_state;
#endif

#if (UI_Meter_Method > Meter_SelfADC) 
extern uint8_t rxDataBufSPI[SPI_DATA_SIZE];
#endif

#if using_uart1 == 1
extern UART_Control  uart1Ctrl;
#endif
#if using_uart2 == 1
extern UART_Control  uart2Ctrl;
#endif
#if using_uart3 == 1
extern UART_Control  uart3Ctrl;
#endif
#if using_uart4 == 1
extern UART_Control  uart4Ctrl;
#endif
#if using_uart5 == 1
extern UART_Control  uart5Ctrl;
#endif

#if finger_sensor_type > 0
extern finger_control  fingerCtrl;
extern finger_info     fingerInfo;
#endif

#if meter485_ON > 0 
extern uint8_t  rdMeter485Idx; 
extern uint8_t  rdMeter485Cmd[9];
extern UI_Meter mt485_Data;
extern uint64_t  mt485RdTm;
#endif //#if meter485_ON > 0

#if RESV_CHG_ON  > 0 || PlugCharge_And_Resv
extern ResvCtrl  resv_data;
#endif

extern union flashDataUnion writeData[Write_Data_size];

#if BLE_WIFY_EN > 0
extern BleWiFiData  bleWiFi_Data;
extern uint8_t  bw_arrTmp[bw_mac_size * 2];
extern ChgrSnapshot chgr_snapshort;
extern uint8_t  srv_pwd[16];
extern uint8_t encryptionArr[chgrSnapshotSM4Len];
extern char base64Arr[chgrSnapshotBase64Len];	
#endif


#if Nor_Flash > 0
extern uint16_t NorFlashDeviceId;
#endif
#if LOG_ON > 0
extern uint16_t    Log_Saved_Sum;
extern struct log_Item  log_temp;
extern union logDataUnion writeLogData[Logs_Data_size];
#if Nor_Flash > 0 
extern uint16_t  log_sect_read_id;
extern uint16_t  log_sect_save_id;
extern union logDataUnion readLogData[Logs_Data_size];
#endif
#endif

#if CURVE_ON > 0
extern uint16_t    Curv_Saved_Sum; 
extern struct Curv_Item  curvTemp;
extern union curvDataUnion writeCurvData[Curv_Data_size];
#if Nor_Flash > 0 
	extern uint16_t  curv_sect_read_id; 
	extern uint16_t  curv_sect_save_id;
	extern union curvDataUnion readCurvData[Curv_Data_size];
#endif
#endif // #if CURVE_ON > 0


#endif
